必须分区通过生成包含 true 和 false 条目的映射?

2022-09-02 22:03:04

partitioningBy 收集器将谓词应用于流中的每个元素,并生成从布尔值到流中满足或不满足谓词的元素列表的映射。例如:

Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3))
// {false=[1, 2], true=[3, 4]}

分区的目的中所述,观察到的行为是 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]}

该行为是否实际上在某处指定?Javadoc只说:

返回一个收集器,该收集器根据谓词对输入元素进行分区,并将它们组织到 .对返回的 Map 的类型、可变性、可序列化性或线程安全性没有保证。Map<Boolean, List<T>>

符合要求的实现是否可以改为返回这些:

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 似乎只包含相同的文档,但没有关于映射将包含哪些条目的额外讨论。


答案 1

Java 9 Javadoc的方法中,有一个澄清,使它更加明确:

返回的 Map 始终包含假键和真键的映射。


答案 2

推荐