Jos*_*lor 17 java language-lawyer java-8 java-stream
所述partitioningBy集电极施加到谓词中的每个元素流,并产生从布尔地图以从满足或不满足谓词流元素的列表.例如:
Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3))
// {false=[1, 2], true=[3, 4]}
Run Code Online (Sandbox Code Playgroud)
正如分区的目的是什么所讨论的,观察到的行为是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]}
Run Code Online (Sandbox Code Playgroud)
这种行为实际上是在某处指定的吗?Javadoc只说:
返回一个Collector,它根据Predicate对输入元素进行分区,并将它们组织成一个
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]}
Run Code Online (Sandbox Code Playgroud)
相应的JSR 335似乎只包含相同的文档,但没有关于地图将包含哪些条目的额外讨论.
use*_*547 16
在该方法的Java 9 Javadoc中,有一个澄清,使其更明确:
返回的Map始终包含false和true键的映射.