必须分区通过生成包含 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 始终返回一个包含 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只说:
返回一个收集器,该收集器根据谓词对输入元素进行分区,并将它们组织到 .对返回的 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 似乎只包含相同的文档,但没有关于映射将包含哪些条目的额外讨论。