Tengo un problema al recopilar algunos valores de lista en depósitos. Por ejemplo, supongamos que tengo una lista de cadenas:

List<String> strs = Arrays.asList("ABC", "abc", "bca", "BCa", "AbC");

Y quiero poner las cadenas en un conjunto (o lista) de conjuntos, que contienen solo cadenas de mayúsculas y minúsculas, es decir, por ejemplo, arriba sería una colección de dos conjuntos: [["ABC", "abc", "AbC"], ["bca", "BCa"]]

Así que ayúdame a escribir un coleccionista para este problema.

List<Set<String>> result = strs.stream()
                .collect(/* some collectors magic here */)
4
Ilya 26 ene. 2016 a las 23:10

3 respuestas

La mejor respuesta

La "magia de algunos coleccionistas" que busca se puede realizar en dos pasos:

  • primero, debe agrupar los elementos por la propiedad que está buscando. En este caso, ya que desea ignorar la carcasa, String#toLowerCase hace el trabajo (no olvide el método sobrecargado que toma un Locale como parámetro). También desea que los valores agrupados sean únicos para poder usar la versión sobrecargada de groupingBy para ponerlos en un Set (la implementación predeterminada usa un List)
  • ya que no está interesado en las claves, simplemente tome los valores del mapa resultante y colóquelos en una lista (si realmente necesita una lista) usando el colector collectingAndThen.

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toSet;

...

List<Set<String>> result = 
    strs.stream()
        .collect(collectingAndThen(groupingBy(String::toLowerCase, toSet()), 
                                   m -> new ArrayList<>(m.values())));
11
Alexis C. 26 ene. 2016 a las 20:49

Aquí está el código de AbacusUtil

List<String> strs = N.asList("ABC", "abc", "bca", "BCa", "AbC");
List<Set<String>> lists = Stream.of(strs).groupBy(N::toLowerCase, Collectors.toSet()).map(Entry::getValue).toList();

Declaración: Soy el desarrollador de AbacusUtil.

0
user_3380739 29 ene. 2019 a las 06:09

Tratar:

List<Set<String>> result = 
  strs.stream()
      .collect(groupingBy(String::toLowerCase, toSet())) // Map<String, Set<String>>
      .values()            // Collection<Set<String>>
      .stream()            // Stream<Set<String>> 
      .collect(toList());  // List<Set<String>>
2
Jean Logeart 26 ene. 2016 a las 20:30