列表中的筛选对象排列<;列表<;进入<;字符串,双>&燃气轮机&燃气轮机;使用Java8

列表中的筛选对象排列<;列表<;进入<;字符串,双>&燃气轮机&燃气轮机;使用Java8,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,从条目列表开始我刚刚找到了以下方法的所有组合: public static <T> Stream<List<T>> getCombinationsStream(List<T> list) { return LongStream.range(1 , 1 << list.size()) .mapToObj(l -> bitMapToList(l, list)); } 使用此列表,预期结果将只有一

条目列表开始
我刚刚找到了以下方法的所有组合:

public static <T> Stream<List<T>> getCombinationsStream(List<T> list) {   
    return LongStream.range(1 , 1 << list.size())
            .mapToObj(l -> bitMapToList(l, list));
}
使用此列表,预期结果将只有一个列表:

//result
[k2=30, k3=70]

我认为这个问题可以通过.filter()和其他流操作来解决,但我不知道如何解决。

这里有一种解决方法:

Optional<List<Entry<String, Double>>> min = 
        getCombinationsStream(myList)
                 .filter(l -> l.stream()
                               .mapToDouble(Map.Entry::getValue).sum() == value)
                 .min(Comparator.comparingInt(List::size));
可选最小值=
getCombinationsStream(myList)
.filter(l->l.stream()
.mapToDouble(Map.Entry::getValue).sum()==value)
.min(比较器.comparingit(列表::大小));

使用所述条件进行筛选,然后查找最小大小的条目列表。

因此,最后,您想要一个双部分总和为所需值(100)的
列表吗?是的,您是对的
//result
[k2=30, k3=70]
Optional<List<Entry<String, Double>>> min = 
        getCombinationsStream(myList)
                 .filter(l -> l.stream()
                               .mapToDouble(Map.Entry::getValue).sum() == value)
                 .min(Comparator.comparingInt(List::size));