Java 8 Stream API features --- map/reduce methods

来源:互联网 发布:jira mac 破解版下载 编辑:程序博客网 时间:2024/06/05 04:18

在 jdk 1.8 里面新增加了 Stream API ,为了去更高效的处理 huge data。那么怎么使用这些 API 呢,一点一点了解,先走马观花看一遍:
要做的事情是先把每个 element * 2 , 然后再相加。

public static void main(String... args){        List<Integer> values = Arrays.asList(1,2,3,4);        System.out.println(values.stream().map(i -> i*2).reduce(0,(c,e) -> c+e));}

现在开始拆分:
values.stream() 是把 List 转换成 Stream ,它是 Collection interface 里新加入的一个 default method , since 1.8 :
这里写图片描述

所以我们可以先这么写,把它拆分开来后面再合并到一起。

        Function<Integer,Integer> f = new Function<Integer, Integer>() {            @Override            public Integer apply(Integer i) {                return i * 2;            }        };        Stream<Integer> s = values.stream();        Stream<Integer> s1 = s.map(f);// map will take a value,it will convert that value into the specified output you need .//这里的 map 接收的 value 就是 Function,所以这里可以写一个 Function ,它是一个functional interface,这就意味着可以把它用 lambda expression 把它替换掉 ,然后它返回的也是一个 Stream。可以看一眼。 

这里写图片描述

这里写图片描述

Stream<Integer> s1 = s.map(i -> i*2);

再看后面的 reduce method .这个 method 有三种重载形式, 这里用到它接收一个BinaryOperator的参数,和上面的 Function 在同一个package,可以再把它分出来:

        Function<Integer,Integer> f = new Function<Integer, Integer>() {            @Override            public Integer apply(Integer i) {                return i * 2;            }        };        BinaryOperator<Integer> b = new BinaryOperator<Integer>() {            @Override            public Integer apply(Integer i, Integer j) {                return i + j;            }        };        Stream<Integer> s = values.stream();        Stream<Integer> s1  = s.map(f);        Integer result = (Integer)s1.reduce(0,b);

这里写图片描述
这里写图片描述
再用 lambda expression 把上面的 b 替换掉:

    public static void main(String... args){        List<Integer> values = Arrays.asList(1,2,3,4);        System.out.println(values.stream().map(i -> i*2).reduce(0,(c,e) -> c+e));        Stream<Integer> s = values.stream();        Stream<Integer> s1  = s.map(i -> i*2);        Integer result = (Integer)s1.reduce(0,(c,e) -> c+e);        System.out.println(result);    }

可以再写得好看点,并且用 Integer.sum()将 c+e替换掉。

    System.out.println(values.stream()                         .map(i -> i*2)                         .reduce(0,(c,e) -> Integer.sum(c,e)));

不会无缘无故这么写的,因为可以用 method reference 把它再替换掉:

    System.out.println(values.stream()                         .map(i -> i*2)                         .reduce(0,Integer::sum));

是不是又简洁多了,awesome !
想象一下同样实现相同的功能,用 Jdk 1.7以前的代码,要写多少行呢。

更多可以参考这里:http://docs.oracle.com/javase/8/docs/api/

0 0
原创粉丝点击