Collectors.partitioningBy:
Map> partitioned =
listOfEmployees.stream().collect(
Collectors.partitioningBy(Employee::isActive));
生成的映射包含两个列表,对应于谓词是否匹配:
List activeEmployees = partitioned.get(true);
List formerEmployees = partitioned.get(false);
有几个原因使用partitioningBy over groupingBy(如Juan Carlos Mendoza所示):
首先,groupingBy的参数是Function< Employee,Boolean> (在这种情况下),因此有可能向它传递一个可以返回null的函数,这意味着如果该函数为任何一个雇员返回null,则会有第三个分区. partitioningBy使用Predicate< Employee>,因此它只能返回2个分区.
其次,在带有partitioningBy的结果映射中得到两个列表(*);使用groupingBy,您只获得键/值对,其中元素映射到给定键:
System.out.println(
Stream.empty().collect(Collectors.partitioningBy(a -> false)));
// Output: {false=[], true=[]}
System.out.println(
Stream.empty().collect(Collectors.groupingBy(a -> false)));
// Output: {}