The 分区依据 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-收集器将谓词应用于流中的每个元素,并生成从布尔值到流中满足或不满足谓词的元素列表的映射。例如:
Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3))
// {false=[1, 2], true=[3, 4]}
正如中所讨论的分区的目的是什么 https://stackoverflow.com/questions/27993604/whats-the-purpose-of-partitioningby, the observed行为是分区依据总是返回一个包含两者条目的地图true and false. E.g.:
Stream.empty().collect(partitioningBy(x -> false));
// {false=[], true=[]}
Stream.of(1,2,3).collect(partitioningBy(x -> false));
// {false=[1, 2, 3], true=[]}
Stream.of(1,2,3).collect(partitioningBy(x -> true));
// {false=[], true=[1, 2, 3]}
该行为实际上是在某处指定的吗? Javadoc 只说:
返回一个收集器,它根据a对输入元素进行分区
谓词,并将它们组织成Map<Boolean, List<T>>
。有
不保证类型、可变性、可序列化性或
返回的 Map 的线程安全。
符合要求的实现可以返回这些:
Stream.empty().collect(partitioningBy(x -> false));
// {}, or {false=[]}, or {true=[]}
Stream.of(1,2,3).collect(partitioningBy(x -> false));
// {false=[1, 2, 3]}
Stream.of(1,2,3).collect(partitioningBy(x -> true));
// {true=[1, 2, 3]}
相应的JSR 335 https://jcp.org/en/jsr/detail?id=335似乎只包含相同的文档,但没有关于地图将包含哪些条目的额外讨论。