Pregunta Lista Java 8 en Mapa


Quiero traducir una Lista de objetos en un Mapa utilizando las secuencias y lambdas de Java 8.

Así es como lo escribiría en Java 7 y abajo.

private Map<String, Choice> nameMap(List<Choice> choices) {
        final Map<String, Choice> hashMap = new HashMap<>();
        for (final Choice choice : choices) {
            hashMap.put(choice.getName(), choice);
        }
        return hashMap;
}

Puedo lograr esto fácilmente usando Java 8 y Guava, pero me gustaría saber cómo hacerlo sin Guava.

En Guava:

private Map<String, Choice> nameMap(List<Choice> choices) {
    return Maps.uniqueIndex(choices, new Function<Choice, String>() {

        @Override
        public String apply(final Choice input) {
            return input.getName();
        }
    });
}

Y guayaba con Java 8 lambdas.

private Map<String, Choice> nameMap(List<Choice> choices) {
    return Maps.uniqueIndex(choices, Choice::getName);
}

684
2017-12-03 23:18


origen


Respuestas:


Residencia en Collectors documentación es tan simple como:

Map<String, Choice> result =
    choices.stream().collect(Collectors.toMap(Choice::getName,
                                              Function.identity()));

1031
2017-12-03 23:30



Si tu clave es NO garantizado para ser único para todos los elementos en la lista, debe convertirlo a Map<String, List<Choice>> en lugar de un Map<String, Choice>

Map<String, List<Choice>> result =
 choices.stream().collect(Collectors.groupingBy(Choice::getName));

205
2017-08-22 18:20



Use getName () como la clave y la opción como el valor del mapa:

Map<String, Choice> result =
    choices.stream().collect(Collectors.toMap(Choice::getName, c -> c));

107
2018-02-28 07:18



Aquí hay otro en caso de que no quiera usar Collectors.toMap ()

Map<String, Choice> result =
   choices.stream().collect(HashMap<String, Choice>::new, 
                           (m, c) -> m.put(c.getName(), c),
                           (m, u) -> {});

11
2018-04-19 18:38



Si no te importa usar una lib de terceros (Vavr (anteriormente conocido como Javaslang)) podrías usar nuevas colecciones inmutables poderosas:

// import javaslang.collection.*;
Map<String, Choice> map = list.toMap(choice -> Tuple.of(choice.getName(), choice));

También hay muchos métodos para convertir colecciones de Java adelante y atrás.

Por favor, lea más sobre el nuevas colecciones aquí.

Descargo de responsabilidad: soy el creador de Vavr.


10
2018-02-21 21:59



Si no te importa usar bibliotecas de terceros, AOL cíclope-reacciona lib (la divulgación soy un colaborador) tiene extensiones para todos Colección JDK tipos, incluidos Lista y Mapa.

ListX<Choices> choices;
Map<String, Choice> map = choices.toMap(c-> c.getName(),c->c);

8
2018-02-24 17:45



Una opción más de manera simple

Map<String,Choice> map = new HashMap<>();
choices.forEach(e->map.put(e.getName(),e));

8
2018-04-07 07:02