如何用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] } }
逻辑拆解
计算子列表和:
通过map遍历外层列表的每个子列表,内部用mapToInt将包装类型Integer转为基础类型int(避免自动装箱拆箱开销),再调用sum()直接得到子列表的总和,此时外层流变为存储所有求和值的Stream<Integer>。降序排序:
使用Comparator.reverseOrder()实现降序排列,让最大的求和值排在流的最前面。截取前3个元素:
调用limit(3)只保留流中前3个元素,即最大的三个求和值。收集为列表:
用collect(Collectors.toList())将处理后的流转换为List<Integer>,得到预期结果。
补充说明
- 如果子列表总数不足3个,
limit(3)会返回所有存在的求和值,不会抛出异常。 - 用
mapToInt+sum()的组合比reduce求和更直观,且针对数值类型做了性能优化。
内容的提问来源于stack exchange,提问作者ITGeek
相关产品推荐
相关产品推荐

