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

在 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值