Quiero convertir Map<String,List<String>> a Map<String,Set<String>> para una búsqueda optimizada. Se me ocurrió el siguiente enfoque tradicional.
for (Map.Entry<String, List<String>> entry : this.mapWithList.entrySet()) { Set<String> hSet = new HashSet<>(entry.getValue()); this.mapWithSet.put(entry.getKey(), hSet); } Me pregunto cómo puedo hacerlo usando forEach en Java 8 .
Además, con forEach lambda, ¿será mejor con el rendimiento del código?
¿Será mejor con el rendimiento del código?
No, no lo hará. Las soluciones iterativas suelen ser más eficaces.
¿Cómo puedo hacerlo usando
forEach
Hay una operación especial de collect() en la API de transmisión que está destinada a llenar un contenedor mutable (por ejemplo, Collection , StringBuilder , etc.) con el contenido de la canalización de transmisión. La documentación desaconseja encarecidamente el uso de forEach() para ese propósito. Considere utilizar forEach() solo como último recurso , cuando no haya otra forma de lograrlo.
Para hacer eso con collect() , primero necesita crear una secuencia de entradas .
En función de cada entrada , se debe crear una nueva entrada , la operación map() se utiliza para ese propósito. El método estático Map.entry() se usa para instanciar una nueva entrada.
Y luego aplique la operación de terminal collect() pasando Collectors.toMap() como parámetro, que crea un colector ( objeto responsable de colocar los elementos de flujo en un contenedor mutable, un mapa en este caso ) basado en las dos funciones proporcionadas (por claves y valores ).
main()
public static void main(String[] args) { Map<String,List<String>> mapWithList = Map.of("1", List.of("1", "2", "3")); Map<String,Set<String>> result = mapWithList.entrySet().stream() .map(entry -> Map.entry(entry.getKey(), new HashSet<>(entry.getValue()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println(result); }Producción
{1=[1, 2, 3]}Puede utilizar este enfoque:
public static void main(String[] args) { Map<String, List<String>> inputMap = new HashedMap<>(); List<String> a = new ArrayList<>(); a.add("a1"); a.add("a2"); inputMap.put("a", a); List<String> b = new ArrayList<>(); b.add("b1"); b.add("b2"); inputMap.put("b", b); System.out.println(inputMap); Map<String, Set<String>> resultSet= inputMap.entrySet().stream() .collect(Collectors.toMap(Entry::getKey, e -> new HashSet<>(e.getValue()))); System.out.println(resultSet); }solución de una línea usando gson! (o cualquier otro serializador JSON)
Map<String, Set<String>> result = gson.fromJson(gson.toJson(otherMap), Map.class);ambos mapas tienen la misma representación JSON. piensa fuera de la caja ;)