Stream.reduce()对Java对象进行操作
reduce()对Java 对象的操作
除了可以对数值进行累积计算外,灵活运用reduce()也可以对Java对象进行操作。下面的代码演示了如何将配置文件的每一行配置通过map()和reduce()操作聚合成一个Map<String, String>:
/**
* @Auther Mario
* @Date 2021-01-13 16:47
* @Version 1.0
* @description
* 流的特点是每个元素只遍历一次,聚合操作无非就是一个遍历+累加计算的过程,内部已经自动帮你遍历了
*
* 你想再遍历一遍,那只能构造一个新的stream
*/
public class ReduceTest {
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9);
int sum = Stream.of(1,2,3,4,5,6,7,8,9).reduce(0,(acc,n) -> acc + n);
System.out.println(sum);
List<String> props = List.of("profile=native", "debug=true", "logging=warn", "interval=500");
Map<String,String> map = props.stream().
// 把k=v转换为Map[k]=v:
//此时map()返回的是一个Map,不能再下面一步调用m.put()函数,因为put()函数是一个map添加key-value,
// 形式是map.put(1,"google"),put(kv)不符合这个表达式
map(kv ->{
String[] ss = kv.split("\=",2);
// System.out.println(ss[0]+ss[1]);
return Map.of(ss[0],ss[1]);
}).
// 把所有Map聚合到一个Map: ,new HashMap<String,String>()就是初始值,新建的Map,
//reduce()操作首先初始化结果为指定值(这里是new HashMap),此时m = new HashMap()
reduce(new HashMap<String,String>(),(m,kv) ->{
// m.put(kv);
m.putAll(kv);
return m;
});
map.forEach((k,v) -> {
System.out.println(k + " = "+ v);
});
}
}
/**
* 总结一下:
* map()和filter()都是Stream的转换方法,而Stream.reduce()则是Stream的一个聚合方法,
* 它可以把一个Stream的所有元素按照聚合函数聚合成一个结果。
* reduce()方法将一个Stream的每个元素依次作用于BinaryOperator,并将结果合并。
*
* reduce()是聚合方法,聚合方法会立刻对Stream进行计算。
*/
结果如下:
logging = warn interval = 500 debug = true profile = native
使用map.put(kv)运行结果:
总结一下:
-
map()和filter()都是Stream的转换方法,而Stream.reduce()则是Stream的一个聚合方法, 它可以把一个Stream的所有元素按照聚合函数聚合成一个结果。 reduce()方法将一个Stream的每个元素依次作用于BinaryOperator,并将结果合并。 reduce()是聚合方法,聚合方法会立刻对Stream进行计算。
