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

如何用Stream对Map中Plan对象列表按fee字段排序?

问题分析与解决方案

你的代码之所以没生效,核心问题有两个:

  1. 语法错误:forEach的lambda代码块未正确闭合,后续的collect操作没有归属的流,根本无法编译通过。
  2. 逻辑问题:stream().sorted()只会生成一个排序后的新流,不会自动修改原列表,你没有把排序后的结果写回原列表或生成新的Map。

下面提供两种可行的实现方式:

方式一:原地修改原Map中的列表

如果允许修改原Map里的List内容,可以先通过Stream生成排序后的列表,再替换原列表的元素:

map.values().forEach(lst -> {
    // 生成排序后的新列表
    List<Plan> sortedPlans = lst.stream()
                                .sorted(Comparator.comparingDouble(Plan::getFee))
                                .collect(Collectors.toList());
    // 清空原列表并添加排序后的元素
    lst.clear();
    lst.addAll(sortedPlans);
});

如果追求更高效率,也可以不用Stream,直接用Collections.sort原地排序:

map.values().forEach(lst -> Collections.sort(lst, Comparator.comparingDouble(Plan::getFee)));

方式二:生成新的排序后Map(不修改原数据)

如果不想改动原Map和原列表,而是生成一个全新的排序后Map,可以通过entrySet流处理:

Map<String, List<Plan>> sortedMap = map.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey, // 保留原键
        entry -> entry.getValue().stream() // 对每个值列表排序
            .sorted(Comparator.comparingDouble(Plan::getFee))
            .collect(Collectors.toList())
    ));

内容的提问来源于stack exchange,提问作者BigEndian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:07:37