You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:37:32