【发布时间】:2020-12-02 19:57:21
【问题描述】:
在 java 1.8 或更高版本上是否可以减少列表列表?
当数字的总和不能超过 8 时,我需要数字数组。
示例:我有以下列表:[ 2 , 4 , 6 ]。 返回值可以是 [ [ 2 , 4 ] , [ 6 ] ] 或 [ [ 2, 6 ],[ 4 ] ]。
我尝试了以下方法:
List<Integer> nums = Arrays.asList(2,4,6);
nums.stream()
.filter((p) -> p <= 8)
.map(Collections::singleton)
.reduce(new ArrayList<List<Integer>>(), (s1, s2) -> {
int sumS1 = s1.stream().reduce(0, (n1, n2) -> n1 + n2);
if (sumS1 == 8 ) return s1;
int sumS2 = s1.stream().reduce(0, (n1, n2) -> n1 + n2);
if (sumS1 + sumS2 <= 8 ) return s1.addAll(s2);
return s1;
})
.collect(Collectors.toSet());
但我没有得到预期的结果。
我使用有状态和访问控制的外部变量,但这不是最好的方法。
有没有办法用 Stream 和无状态来构建它?
我认为是在 flatMap 对面
【问题讨论】:
-
Java Streams 是错误的工具。这个问题可能需要用 recursion 来实现。
标签: java list java-8 java-stream reduce