Java Stream操作中如何查看.collect()执行过程中的中间结果
解决方案
问题根因
Collectors.partitioningBy执行完成后返回的是Map<Boolean, Set<String>>类型的集合对象,不属于Stream流,因此无法直接调用Stream专属的filter、peek方法- Stream的
forEach是终结操作,执行后没有返回值,调用后无法继续链式执行后续的entrySet()处理逻辑
可选实现方案
方案1:拆分中间变量(最推荐,可读性高无额外开销)
直接把链式调用从collect位置拆分,新增中间变量存储结果打印后再继续后续处理:
var landmarks = Set.of("Eiffel Tower", "Statue of Liberty", "Stonehenge", "Mount Fuji"); // 存储partitioningBy的处理结果 var intermediateMap = landmarks .stream() .collect(Collectors.partitioningBy(b -> b.contains(" "))); // 打印中间结果 System.out.println("partitioningBy处理结果:" + intermediateMap); // 继续执行后续原有逻辑 var result = intermediateMap .entrySet() .stream() .flatMap(t -> t.getValue().stream()) .collect(Collectors.groupingBy(s -> !s.startsWith("S")));
方案2:不拆分原有链式结构
如果不想调整原有代码的链式写法,可以借助Optional的peek能力实现打印,无需额外定义工具方法:
var landmarks = Set.of("Eiffel Tower", "Statue of Liberty", "Stonehenge", "Mount Fuji"); var result = Optional.of(landmarks .stream() .collect(Collectors.partitioningBy(b -> b.contains(" "))) ) // 此处打印中间结果,不会打断链式调用 .peek(map -> System.out.println("partitioningBy处理结果:" + map)) // 取出Map对象继续执行后续原有逻辑 .get() .entrySet() .stream() .flatMap(t -> t.getValue().stream()) .collect(Collectors.groupingBy(s -> !s.startsWith("S")));
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

