jdk 1.8版本中stream的collect方法
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
stream.collect() 的本质由三个参数构成,
-
- Supplier 新建对象, 用来返回的最终结果
-
- BiConsumer accumulator 累加器直接取,将流中每个被遍历的元素添加到新建对象中
-
- BiConsumer combiner 合并器, 在有并行流的时候才会有用, 一个流时代码不会走到这里
举例说明,这里使用方法注释中的例子来说明,代码如下
String concat = stringStream.collect(StringBuilder::new, StringBuilder::append,
StringBuilder::append)
.toString();
改造一下,增加日志,使用map来体验collect方法
Map<String, Object> map = new HashMap<>(16);
map.put("name", "飒飒飒");
map.put("sex", "帅哥");
map.put("age", "18");
for (Map.Entry<String, Object> s : map.entrySet()) {
log.info("{}", s);
}
String concat = map.entrySet().stream().collect(StringBuilder::new, (stringBuilder, entry) -> {
log.info("开始利用新建的对象进行累加原始串:{}, 待累加的值:{}", stringBuilder, entry);
stringBuilder.append(entry);
stringBuilder.append(" ");
log.info("stringBuilder累加一次后的结果: {}",stringBuilder);
},
(stringBuilder1, stringBuilder2) -> {
log.info("流合并,流对象1:{}, 流对象2:{}", stringBuilder1, stringBuilder2);
stringBuilder1.append(stringBuilder2);
})
.toString();
log.info("最终结果:{}", concat);
输出结果如下
11:08:09.474 [main] INFO - sex=帅哥
11:08:09.477 [main] INFO - name=飒飒飒
11:08:09.477 [main] INFO - age=18
11:08:09.511 [main] INFO - 开始利用新建的对象进行累加原始串:, 待累加的值:sex=帅哥
11:08:09.511 [main] INFO - stringBuilder累加一次后的结果: sex=帅哥
11:08:09.511 [main] INFO - 开始利用新建的对象进行累加原始串:sex=帅哥 , 待累加的值:name=飒飒飒
11:08:09.511 [main] INFO - stringBuilder累加一次后的结果: sex=帅哥 name=飒飒飒
11:08:09.511 [main] INFO - 开始利用新建的对象进行累加原始串:sex=帅哥 name=飒飒飒 , 待累加的值:age=18
11:08:09.511 [main] INFO - stringBuilder累加一次后的结果: sex=帅哥 name=飒飒飒 age=18
11:08:09.511 [main] INFO - 最终结果:sex=帅哥 name=飒飒飒 age=18
通过一个map遍历来,很清晰的发型collect方法的处理过程。
使用方法引用来传递行为, 更加清晰易懂, new(新建) -> add(累加) -> addAll(合并)