Java8新特性

Stream

类Stream是对象和原始数据类型上的流。Stream在几个方面与集合不同:

  • 没有存储空间。流不是存储元素的数据结构。相反,它通过一系列计算操作从数据结构,数组,生成器功能或I / O通道等源中传递元素。
  • 本质上是功能性的。对流的操作会产生结果,但不会修改其源。例如,对Stream 从集合中获取的a Stream进行过滤会产生一个不包含过滤后元素的新元素,而不是从源集合中删除元素。
  • 懒惰寻求。许多流操作(例如过滤,映射或重复删除)可以延迟执行,从而暴露出优化的机会。例如,“ String使用三个连续的元音查找第一个”不需要检查所有输入字符串。流操作分为中间(产生Stream)操作和最终(产生值或副作用)操作。中间操作总是很懒。
  • 可能无界。尽管集合的大小是有限的,但流不是必需的。诸如limit(n)或 的短路操作findFirst()可以允许对无限流的计算在有限时间内完成。
  • 消耗品。在流的生存期内,流的元素只能访问一次。与一样Iterator,必须生成新的流以重新访问源中的相同元素。

stream操作分为中间操作终端操作,合并以形成pipeline

  • pipeline由源(如Collection,数组,生成器函数或I / O通道),零个或多个中间操作以及一个终端操作。
  • 中间操作,执行一个中间操作(如filter)并不会执行实际的过滤操作,而是创建一个新的stream,并将原stream中符合条件的元素放入新创建的stream。
  • 终端操作,会遍历stream并得出结果或者附带结果;在执行终端操作之后,pipeline已经处理完毕,不可以在使用了。

下面对常见的stream操作进行介绍

  • filter
  • map
  • mapToInt
  • sorted
  • distinct
  • forEach,
  • sum
  • reduce

根据指定模型,计算源内数据,得到一个最终结果

对例子进行解释

Function接口

一个Function<T, R>对象相当于一个函数,其中T是函数参数类型,R是函数返回值类型,等号后面的lambda表达式为函数逻辑。

R apply(T t)相当于函数调用,t为调用函数式传入的参数值。

public class FunctionTest {
    public static void main(String[] args) {
        Integer num = 5;
        System.out.println(functionAdd(num)); // 6
        System.out.println(add(num)); // 6
    }

    public static Integer functionAdd(Integer num){
        Function<Integer, Integer> function = x -> x + 1;
        return function.apply(num);
    }

    public static Integer add (Integer num) {
        return num + 1;
    }
}

Function<V, R> compose()、Function<V, R> andThen()相当于函数组合,源码如下。

/**
     * @return a composed function that first applies the {@code before}
     * function and then applies this function
     */
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}
/**
     * @return a composed function that first applies this function and then
     * applies the {@code after} function
     */
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
    Objects.requireNonNull(after);
    return (T t) -> after.apply(apply(t));
}

根据方法名获取对象方法值

@Data
@AllArgsConstructor
public class Person {
    private Double age;
    private Double height;
}
@AllArgsConstructor
@Getter
public enum PersonAttribute {
    AGE("age", Person::getAge),
    HEIGHT("height", Person::getHeight);

    private String name;
    private Function<Person, Double> getAttribute;

    public static PersonAttribute ofName(String name) {
        try {
            return Arrays.stream(PersonAttribute.values())
                    .filter(personAttribute -> personAttribute.name.equals(name.trim()))
                    .findFirst()
                    .orElseThrow(() -> new Exception("input attribute's name error:" + name));
        } catch (Exception exception){
            exception.printStackTrace();
        }
        return null;
    }
}
public class Test {
    public static void main(String[] args) {
        Person person = new Person(18D, 160D);
        Scanner scanner = new Scanner(System.in);
        PersonAttribute personAttribute = PersonAttribute.ofName(scanner.nextLine());
        System.out.println(personAttribute.getGetAttribute().apply(person));
    }
}

::

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342