Должно ли разбиениеBy создавать карту с записями для true и false?

partitioningBy collector применяет предикат к каждому элементу в потоке и создает карту из булевых списков элементов из потока, которые удовлетворяли или не удовлетворяли предикату. Например:

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

Как обсуждалось в Какова цель partitioningBy, наблюдаемое поведение состоит в том, что 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]}

Это поведение действительно указано где-то? Джавадок только говорит:

Возвращает коллекционер, который разделяет входные элементы в соответствии с Predicate и организует их в 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 метода есть пояснение, которое делает его более явным:

Возвращенная Карта всегда содержит сопоставления как для ложных, так и для истинных ключей.