java - mapas - mapa de karnaugh teoria
¿Cómo transformo un Mapa<K, V1> a otro Mapa<K, V2> usando un mapa de funciones en Java 8? (3)
Puede transformarse directamente en el colector:
Map<String, Long> mappedData = inputData.entrySet().stream()
.collect(toMap(Map.Entry::getKey,
entry -> transformers.get(entry.getKey()).apply(entry.getValue())));
Dicha solución es más corta y no crea objetos intermedios.
Si sus inputData
tuvieran el mismo tipo de valor ( Map<String, Long>
), podría realizar la transformación en el lugar:
inputData.replaceAll((key, value) -> transformers.get(key).apply(value));
Quiero transformar un Map<String, Integer>
en otro Map<String, Long>
usando un mapa de funciones en Java 8, haciendo coincidir los datos con las funciones por tecla en ambos mapas. Puedes asumir que ambos mapas tienen las mismas claves.
Probé el siguiente enfoque:
Map<String, Integer> inputData = new HashMap<>();
inputData.put("A",8);
inputData.put("B",7);
inputData.put("C",6);
Map<String, Function<Integer, Long>> transformers = new HashMap<>();
transformers.put("A", x -> x*2L);
transformers.put("B", x -> x+3L);
transformers.put("C", x -> x+11L);
Map<String, Long> mappedData = inputData.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(
entry.getKey(),
transformers.get(entry.getKey()).apply(entry.getValue())))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
Resultado esperado: {A = 16, B = 10, C = 17}.
¿Hay alguna forma más sencilla de expresar " aplicar el mapa de transformadores al mapa de entrada de datos coincidentes por clave " en la API de Java Streams?
Si una línea extra no te molesta, prueba
Map<String, Long> result = new HashMap<>(); // this line
inputData.forEach((k, v) -> result.put(k, transformers.get(k).apply(v));
También puede comenzar desde el mismo mapa de transformers
, que parece un poco más fácil:
Map<String, Long> collect = transformers.entrySet().stream()
.collect(toMap(Map.Entry::getKey,
e -> e.getValue().apply(inputData.get(e.getKey()))));