Ya he pasado por algunos ejemplos y los que no funcionó para mí.
Esto es lo que estoy tratando de hacer:
Tengo una List<SomeClass>
de las clases siguientes:
class SomeClass {
String rid;
String name;
...
}
Los valores en mi List
tener este aspecto:
SomeClass(1,"apple")
SomeClass(1,"banana")
SomeClass(1,"orange")
SomeClass(2,"papaya")
SomeClass(2,"peaches")
SomeClass(3,"melons")
Quiero convertir lo anterior List
en una Map<String, Set<String>>
, donde la clave es rid
y el valor es Set
de name
campo.
Para solucionar esto usando Java Streams
que estoy utilizando groupingBy
y que podría venir a continuación la solución:
someClassList
.stream()
.map(SomeClass::getName)
.collect(
Collectors.groupingBy(
SomeClass::getRid, Collectors.toSet()));
Pero esto me da error de compilación. ¿Cómo puedo solucionar esto y cuál es el problema con mi enfoque?
Cuando se llama .map(SomeClass::getName)
en su Stream<SomeClass>
, se obtiene una Stream<String>
. No se puede ejecutar collect(Collectors.groupingBy(SomeClass::getRid,...))
en un Stream<String>
(solamente se pueden ejecutar en una Stream<SomeClass>
). Por lo tanto, su map
paso es equivocado.
Tiene que pasar el Collector
devuelto por Collectors.mapping()
que Collectors.groupingBy()
con el fin de asignar los SomeClass
casos a String
s después de que se agrupan por getRid
.
Map<String, Set<String>> map =
someClassList.stream()
.collect(Collectors.groupingBy(SomeClass::getRid,
Collectors.mapping(SomeClass::getName,
Collectors.toSet())));