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

如何用Java 8 Streams获取整数嵌套列表的前3大求和值

使用Stream API获取嵌套列表子列表和的前3大值

直接给出可运行的实现代码,再拆解每一步的逻辑:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<List<Integer>> integers = Arrays.asList(
                Arrays.asList(8, 9, 4, 5, 6), // sum is 32
                Arrays.asList(10, 0, 6, 3, 7), //sum is 26
                Arrays.asList(1, 9, 2, 16, 3), //sum is 31
                Arrays.asList(2, 22, 4, 5), //sum is 33
                Arrays.asList(15, 6)); //sum is 21

        List<Integer> topThreeSums = integers.stream()
                // 计算每个子列表的求和值
                .map(subList -> subList.stream()
                        .mapToInt(Integer::intValue)
                        .sum())
                // 按数值降序排序
                .sorted(Comparator.reverseOrder())
                // 截取前3个最大的值
                .limit(3)
                // 收集为最终列表
                .collect(Collectors.toList());

        System.out.println(topThreeSums); // 输出 [33, 32, 31]
    }
}

逻辑拆解

  1. 计算子列表和:
    通过map遍历外层列表的每个子列表,内部用mapToInt将包装类型Integer转为基础类型int(避免自动装箱拆箱开销),再调用sum()直接得到子列表的总和,此时外层流变为存储所有求和值的Stream<Integer>。

  2. 降序排序:
    使用Comparator.reverseOrder()实现降序排列,让最大的求和值排在流的最前面。

  3. 截取前3个元素:
    调用limit(3)只保留流中前3个元素,即最大的三个求和值。

  4. 收集为列表:
    用collect(Collectors.toList())将处理后的流转换为List<Integer>,得到预期结果。

补充说明

  • 如果子列表总数不足3个,limit(3)会返回所有存在的求和值,不会抛出异常。
  • 用mapToInt+sum()的组合比reduce求和更直观,且针对数值类型做了性能优化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:06:13