在 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以前的代码,要写多少行呢。