在这个例子中
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>
的地图,因此无效。我该怎么做才能返回Boolean
和List<Integer>
的地图?
答案 0 :(得分:6)
通常情况下,当您想要groupingBy
或partitioningBy
操作中的其他聚合时,您可以通过指定另一个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));
答案 1 :(得分:3)
您需要使用partitioningBy(predicate, downstream)
的两个参数版本,它接受下游收集器:
Map<Boolean, List<Integer>> map =
stream.collect(partitioningBy(a->a.getNum() < 10, mapping(MyClass::getNum, toList())));
此下游组合收集器将流的每个Myclass
元素映射到其num
,并将其收集到List
。
使用静态导入:
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.partitioningBy;
import static java.util.stream.Collectors.toList;