Java Stream代码优化:能否将统计列表最高出现次数键的三段代码简化为1段或2段?
简化Stream统计逻辑的方案
当然可以简化!原代码的逻辑是先提取前缀、统计次数,再找最大次数,最后筛选出对应前缀——这三步确实可以合并成更简洁的写法,下面给你两种实用的简化方案:
方案1:两段式(兼顾可读性与简洁性)
这是最推荐的写法,既保留了代码的清晰性,又把原代码的后两步合并成了一步:
import java.util.*; import java.util.stream.Collectors; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> strList = Arrays.asList("10.0 string1", "10.3 string2", "10.0 string3", "10.4 string4","10.3 string5"); // 第一步:统计每个前缀的出现次数(用默认HashMap即可,无需LinkedHashMap) var countMap = strList.stream() .map(s -> s.split(" ")[0]) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); // 第二步:直接获取出现次数最多的所有前缀 var maxFrequencyPrefixes = countMap.entrySet().stream() .collect(Collectors.collectingAndThen( // 按出现次数分组,TreeMap自动按次数升序排序 Collectors.groupingBy(Map.Entry::getValue, TreeMap::new, Collectors.mapping(Map.Entry::getKey, Collectors.toList())), // 取TreeMap最后一个条目(对应最大次数)的前缀列表 sortedMap -> sortedMap.lastEntry().getValue() )); System.out.println(maxFrequencyPrefixes); // 输出 [10.0, 10.3] } }
为啥这样简化?
- 去掉了原代码中单独获取
max3的步骤,直接通过TreeMap的有序性,拿到次数最大的分组; - 原代码里的
LinkedHashMap没必要保留,因为统计逻辑不需要依赖插入顺序,用默认的HashMap更高效。
方案2:一段式(极致简洁,可读性稍弱)
如果一定要写成单段代码,可以把统计逻辑嵌套进后续处理里,但这个写法的可读性会打折扣,适合对Stream语法非常熟悉的场景:
import java.util.*; import java.util.stream.Collectors; import java.util.function.Function; public class Main { public static void main(String[] args) { List<String> strList = Arrays.asList("10.0 string1", "10.3 string2", "10.0 string3", "10.4 string4","10.3 string5"); var maxFrequencyPrefixes = strList.stream() .map(s -> s.split(" ")[0]) .collect(Collectors.collectingAndThen( // 先完成次数统计 Collectors.groupingBy(Function.identity(), Collectors.counting()), countMap -> countMap.entrySet().stream() .collect(Collectors.collectingAndThen( Collectors.groupingBy(Map.Entry::getValue, TreeMap::new, Collectors.mapping(Map.Entry::getKey, Collectors.toList())), sortedMap -> sortedMap.lastEntry().getValue() )) )); System.out.println(maxFrequencyPrefixes); // 输出 [10.0, 10.3] } }
内容的提问来源于stack exchange,提问作者sid
相关产品推荐
相关产品推荐

