必须partitioningBy生成一个包含true和false条目的地图?
partitioningBy收集器将谓词应用于流中的每个元素,并生成从布尔到满足或不满足谓词的流中元素列表的映射。 例如:
Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3)) // {false=[1, 2], true=[3, 4]}
正如分区的目的是什么所讨论的 , 观察到的行为是partitioningBy总是返回一个包含true和false条目的映射。 例如:
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只说:
返回一个Collector,它根据Predicate对输入元素进行分区,并将它们组织成
Map<Boolean, List>
。 返回的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似乎只包含相同的文档,但没有关于地图将包含哪些条目的额外讨论。
在该方法的Java 9 Javadoc中 ,有一个澄清,使其更明确:
返回的Map始终包含false和true键的映射。