Java 8: recopile y transforme la secuencia en un conjunto único

Java 8: recopile y transforme la secuencia en un conjunto único

En este breve Byte, veremos cómo puede recopilar y transformar una lista en un conjunto de singletons en Java, utilizando la API funcional y junto con el collectingAndThen() coleccionista.

Consejo: Si quieres saber más sobre collectingAndThen() - lea nuestra información detallada "Guía de coleccionistas de Java 8: recopilar y luego ()"!

Convierta una transmisión en un conjunto único

Al recopilar un flujo en una lista (transmitido desde un Java Collection) - puede decidir devolver un inmutable único Set que contiene un único (y estrictamente único) elemento inmutable.

Un método intuitivo para usar aquí es collectingAndThen() que te permite collect() A Stream luego ejecute una función anónima en el resultado:

public class Singleton {
    private final Stream<?> stream;
    
    public Set<?> getSingleton() {
        return stream.collect(
            collectingAndThen(
                toList(),
                l -> {
                    if (l.size() > 1){
                        throw new RuntimeException();
                    } else{
                        return l.isEmpty()
                            ? emptySet()
                            : singleton(l.get(0));
                    }
                }
            )
        );
    }
}

Aquí hemos recopilado la corriente en un Listel cual es un operación terminal (el final del flujo). Luego, esta lista se transmite nuevamente, verificando el tamaño. Si el tamaño es mayor que 1 - un singleton Set no se puede crear. En este ejemplo, esperamos que la tubería de operaciones Antes EL collectingAndThen() call, el flujo se filtra de todos menos de un elemento.

Después de verificar el tamaño, podemos crear un nuevo singleton Set con singleton(l.get(0)) - pasar el primer (y único) elemento de la lista en el Collections.singleton() método.

Puede probar el método y afirmar el resultado correcto con:

@Test
public void shouldCreateSingleton() {
    Singleton s1 = new Singleton(Stream.of(1,2));
    assertThrows(
        RuntimeException.class, 
        () -> s1.getSingleton()
    );
    
    Singleton s2 = new Singleton(Stream.empty());
    Set<?> singleton = s2.getSingleton();
    assertEquals("[]", singleton.toString());
    
    Singleton s3 = new Singleton(Stream.of(1));
    singleton = s3.getSingleton();
    assertEquals("[1]", singleton.toString());
}

Conclusión

En este breve Byte, analizamos cómo puede recopilar y transformar una lista en un conjunto único en Java 8+.

Si quieres conocer otros artículos parecidos a Java 8: recopile y transforme la secuencia en un conjunto único puedes visitar la categoría Código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas