Java Stream按条件减少多个列表

问题描述

在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,n2) -> n1 + n2);
                if (sumS1 + sumS2 <= 8 ) return s1.addAll(s2);
                return s1;
            })
            .collect(Collectors.toSet());

但是我没有得到预期的结果。

我做了有状态的访问控制的外部变量,但这不是最好的方法。

是否可以使用Stream和无状态构建它?

我认为与flatMap相反

解决方法

如果要从所有组合中找到满足条件的组合。

List<Integer> list = Arrays.asList(2,4,6);
List<List<Integer>> result = IntStream.range(0,1 << list.size())
    .mapToObj(i -> IntStream.range(0,list.size())
        .filter(j -> (1 << j & i) != 0)
        .mapToObj(list::get)
        .collect(Collectors.toList()))
    .filter(x -> x.stream().mapToInt(i -> i).sum() < 8)
    .collect(Collectors.toList());
System.out.println(result);

输出

[[],[2],[4],[2,4],[6]]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...