Cadena de salida = names.stream() .sorted((nombre1, nombre2) -> { Cadena[] partes1 = nombre1.split(» «); String apellido1 = partes1[parts1.length – 1]; Cadena[] partes2 = nombre2.split(» «); String apellido2 = partes2[parts2.length – 1]; devolver apellido2.compareTo(apellido1); }) .map(nombre -> { Cadena[] partes = nombre.split(» «); devolver partes[parts.length – 1]; }) .filter(lastName -> lastName.length() >= 5) .reduce(«», (accumulator, element) -> accumulator + element + «, «); System.out.println(«result: » + output); Esto concatenará todas las cadenas juntas, unidas por una coma. (Tendremos una coma final que podríamos quitar al final). reduce nos da una mirada interesante a un área ligeramente más avanzada de streams. Considere si quisiera contar los caracteres de la cadena y devolver un valor entero. ¿Cómo podría hacer eso? El valor de retorno de reduce querría ser un entero, pero los argumentos de acumulador y elemento son cadenas. Dejaré eso para un ejercicio, con esta pregunta de Stack Overflow como una pista y mi introducción a los recolectores de stream de Java como otra. Reutilización de operaciones Hemos visto bastante bien cómo se siente usar y componer algunas de las operaciones funcionales de Java más importantes. Otra faceta importante es la reutilización de código. Digamos que necesitas usar ese sofisticado clasificador de cadenas en varios lugares. En Java, podríamos crear una interfaz funcional para compartir esa operación: