reduce是流操作比较核心的一个方法,max,min,collector等操作,基本都是由reduce来实现的。
reduce 将多个对象转化一个对象。例如求和,求积,求最大值等等操作。
示例代码:
/**
* method1
*
* 对象 >> 对象
*/
public static void testReduce1() {
List objs = Arrays.asList(new Obj(1, "张三"), new Obj(1, "李四"), new Obj(2, "王五"), new Obj(2, "张三"), new Obj(3, "王五"));
Obj obj1 = objs.stream()
.reduce((tmp, obj2) -> {
if (tmp.id >= obj2.id) {
return tmp;
}
return obj2; })
.orElse(null);
System.out.println(obj1.id);
}
这里的代码是求出id最大值的对象,reduce只有一个参数的接口。其实实现接口是处理2个元素,返回一个元素。
其中,obj与obj2是相邻的两元素。返回的新元素在与下一个元素传入。
还有一种,传入2个参数的。第一个参数相当于初始值(item的初始值)。
/**
* method3
*
* 对象 >> 对象
*/
public static void testReduce3() {
List objs = Arrays.asList(new Obj(1, "张三"), new Obj(1, "李四"), new Obj(2, "王五"), new Obj(2, "张三"), new Obj(3, "王五"));
Obj obj1 = objs.stream()
.reduce(new Obj(0, "初始值"), (tmp, obj2) -> {
if (tmp.id >= obj2.id) {
return tmp;
}
return obj2;
});
System.out.println(obj1.id);
}
以上操作是处理item里面的元素,最后结果也是一个item。
2. reduce 处理每一个元素,然后将每一个元素转化为一个新的对象(一般是集合)
示例代码:
/**
* method2
*
* 对象 >> 对象收集器(一般是集合)
* 这里实现id去重
*/
public static void testReduce2() {
List objs = Arrays.asList(new Obj(1, "张三"), new Obj(1, "李四"), new Obj(2, "王五"), new Obj(2, "张三"), new Obj(3, "王五"));
List objList = objs.stream()
.reduce(new ArrayList<>(), (list, item) -> {
if (list.stream().anyMatch(ob -> item.id == ob.id)) {
return list;
}
list.add(item);
return list;
}, (list, list2) -> list);
System.out.println(objList);
}
这里使用reduce实现了去重的功能。修改转换部分,可以实现过滤,放大等等操作。
第一个参数,就是一需要转换的对象初始方法。
第二个参数,是你对每一个元素与你要转换的方法的处理方式。
第三个参数,针对并行流处理,会有多个你要转化的参数,他们之间如何合并。