Java Stream如何不中断管道引用中间结果 合并两次流操作
Java Stream合并频率统计与过滤逻辑实现方案
实现方案
你可以使用JDK自带的Collectors.collectingAndThen收集器实现需求,它可以将收集结果直接传入后续处理函数,无需在流管道外声明中间变量,全程保持链式调用结构:
private static int myMethod(List<Integer> input){ return (int) input .stream() .collect(Collectors.collectingAndThen( Collectors.groupingBy(Function.identity(), Collectors.counting()), freq -> freq.keySet() .stream() .filter(key -> freq.containsKey(freq.get(key))) .count() )); }
原理解释
collectingAndThen接收两个参数:第一个是生成频率Map的groupingBy收集器,第二个是处理收集结果的函数- 频率Map
freq仅在第二个参数的函数作用域内生效,不需要在管道外单独声明 - 整条逻辑保持单Stream链式写法,没有割裂的流声明,符合你的要求
注意:你的逻辑本身依赖全量的频率统计结果,必须先完成所有输入元素的频率统计才能执行后续过滤判断,因此中间Map的开销是不可避免的,该写法只是从语法层面做了链式封装,底层执行逻辑和你原有拆分写法性能完全一致。
内容的提问来源于stack exchange,提问作者AaronC
相关产品推荐
相关产品推荐

