3

在这个例子中

Stream<MyClass>stream = Stream.of(new MyClass(5),new MyClass(15),new MyClass(8),new MyClass(12));

Map<Boolean, List<Integer>> map =
        stream.collect(Collectors.partitioningBy(a->a.getNum()<10));

stream.collect检索布尔映射,因此List<MyClass>它不起作用。我应该怎么做才能返回Booleanand的地图List<Integer>

4

2 回答 2

6

通常,当您想要在groupingByorpartitioningBy操作中使用不同的聚合时,您可以通过在以下位置指定另一个聚合来Collector实现:

Map<Boolean, List<Integer>> map
    = stream.collect(Collectors.partitioningBy(a -> a.getNum()<10,
        Collectors.mapping(MyClass::getNum, Collectors.toList())));

map但是,当分区函数和聚合函数都在同一个属性上工作时,将元素预先设置为该属性值要容易得多:

Map<Boolean, List<Integer>> map2
    = stream.map(MyClass::getNum).collect(Collectors.partitioningBy(num -> num<10));
于 2015-12-09T12:06:01.930 回答
3

您需要使用 的两个参数版本partitioningBy(predicate, downstream),它接受下游收集器:

Map<Boolean, List<Integer>> map = 
    stream.collect(partitioningBy(a->a.getNum() < 10, mapping(MyClass::getNum, toList())));

Myclass这个下游收集器将Stream 的每个元素映射到它们num并将其收集到List.

使用的静态导入:

import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.partitioningBy;
import static java.util.stream.Collectors.toList;
于 2015-12-09T11:09:55.253 回答