java - ¿Debe particionar? ¿Producir un mapa con entradas para verdadero y falso?
java-8 language-lawyer (1)
El recolector partitioningBy aplica un predicado a cada elemento de una secuencia y genera un mapa desde los valores booleanos a las listas de elementos de la secuencia que satisfacen o no satisfacen el predicado. Por ejemplo:
Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3))
// {false=[1, 2], true=[3, 4]}
Como se discutió en ¿Cuál es el propósito de la partición? Por ejemplo , el comportamiento observado es que la partición? Por ejemplo, siempre devuelve un mapa con entradas tanto para verdadero como para falso . P.ej:
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]}
¿Es ese comportamiento realmente especificado en algún lugar? El Javadoc solo dice:
Devuelve un recopilador que particiona los elementos de entrada según un predicado y los organiza en un
Map<Boolean, List<T>>
. No hay garantías sobre el tipo, la mutabilidad, la serialización o la seguridad de subprocesos del Mapa devuelto.
¿Podría una implementación conforme devolver estos en su lugar:
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]}
El JSR 335 correspondiente solo parece incluir la misma documentación, pero no una discusión adicional sobre las entradas que contendrá el mapa.
En Java 9 Javadoc del método , hay una aclaración que lo hace más explícito:
El Mapa devuelto siempre contiene asignaciones para claves tanto falsas como verdaderas.