从Collectors.partitioningBy返回非类类型

时间:2015-12-09 11:06:03

标签: java java-8 java-stream collectors

在这个例子中

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>的地图,因此无效。我该怎么做才能返回BooleanList<Integer>的地图?

2 个答案:

答案 0 :(得分:6)

通常情况下,当您想要groupingBypartitioningBy操作中的其他聚合时,您可以通过指定另一个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;