Collectors.partitioningBy https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-:
Map<Boolean, List<Employee>> partitioned =
listOfEmployees.stream().collect(
Collectors.partitioningBy(Employee::isActive));
结果映射包含两个列表,对应于谓词是否匹配:
List<Employee> activeEmployees = partitioned.get(true);
List<Employee> formerEmployees = partitioned.get(false);
使用的原因有几个partitioningBy
over groupingBy
(根据建议胡安·卡洛斯·门多萨 https://stackoverflow.com/a/46958213/3788176):
首先,参数为groupingBy
is a Function<Employee, Boolean>
(在本例中),因此有可能向其传递一个可以返回 null 的函数, 意味着如果该函数为任何员工返回 null,则将存在第三个分区。partitioningBy
uses a Predicate<Employee>
,所以它只能返回 2 个分区。 这会导致NullPointerException
被收集器抛出:虽然没有明确记录,但对于空键显式抛出异常,大概是因为Map.computeIfAbsent https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-“如果函数返回 null,则不会记录映射”,这意味着元素将从输出中默默删除。 (谢谢lczapski https://stackoverflow.com/users/11733759/lczapski指出这一点)。
其次,您在结果映射中得到两个列表(*):partitioningBy
; with 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: {}
(*) 此行为未记录在Java 8 Java文档 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-,但它是为Java 9 https://docs.oracle.com/javase/9/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-.