必须partitioningBy生成一个包含true和false条目的地图?

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总是返回一个包含truefalse条目的映射.例如:

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键的映射.

  • @Holger是的,我在那之后突然出现了规范变化,并且今天发布了带有变更(b150)的构建. (5认同)
  • 最近我们[讨论](http://stackoverflow.com/questions/41036522/combine-allmatch-nonematch-and-anymatch-on-a-single-stream/41036977#comment69298278_41036977)可能会很安静...... (4认同)