Ответ 1
В Java 9 Javadoc метода есть пояснение, которое делает его более явным:
Возвращенная Карта всегда содержит сопоставления как для ложных, так и для истинных ключей.
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, по-видимому, включает в себя ту же документацию, но не является дополнительной дискуссией о том, какие записи будет содержать карта.
В Java 9 Javadoc метода есть пояснение, которое делает его более явным:
Возвращенная Карта всегда содержит сопоставления как для ложных, так и для истинных ключей.