listmodel lista item java java-8 grouping java-stream collectors

item - lista jframe java



AgrupaciĆ³n de flujosPor: reduciendo al primer elemento de la lista (3)

En realidad, necesitas usar Collectors.toMap aquí en lugar de Collectors.groupingBy :

Map<String, Valuta> map = getValute().stream() .collect(Collectors.toMap(Valuta::getCodice, Function.identity()));

groupingBy se utiliza para agrupar elementos de una secuencia en función de una función de agrupación. 2 Los elementos de transmisión que tendrán el mismo resultado con la función de agrupación se recopilarán en una List de forma predeterminada.

toMap recopilará los elementos en un Map donde la clave es el resultado de la aplicación de un asignador de claves dado y el valor es el resultado de la aplicación de un asignador de valores. Tenga en cuenta que toMap , de forma predeterminada, lanzará una excepción si se encuentra un duplicado.

Tengo una List<Valuta> que se puede representar (simplificada) al estilo JSON:

[{codice = EUR, descripción = Euro, ratio = 1}, {codice = USD, descripción = Dólares, ratio = 1.1}]

Quiero transformar eso en un Map<String, Valuta> así:

{EUR = {codice = EUR, descripción = Euro, ratio = 1}, USD = {codice = USD, descripción = Dólares, ratio = 1.1}}

Escribí esto de una sola línea:

getValute().stream().collect(Collectors.groupingBy(Valuta::getCodice));

pero esto devuelve un Map<String, List<Valuta>> lugar de lo que necesito.

Supongo que la función de mapping() funcionaría para mí, pero no sé cómo.


Es un poco tarde en el juego, pero prueba esto:

Map<String, Valuta> map = getValute().stream() .collect(Collectors.groupingBy(Valuta::getCodice, Collectors.collectingAndThen( Collectors.toList(), values -> values.get(0))));


Podría usar toMap

Map<String, Valuta> map = list .stream() .collect(Collectors.toMap(Valuta::getCodice, v -> v));

Puede reemplazar v->v con Function.identity() si lo encuentra más legible.