java java-8 language-lawyer java-stream

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.