Recién comencé a mirar Java 8 y a probar lambdas pensé que trataría de reescribir una cosa muy simple que escribí recientemente. Necesito convertir un Mapa de Cadena a Columna en otro Mapa de Cadena a Columna donde la Columna en el nuevo Mapa es una copia defensiva de la Columna en el primer Mapa. La columna tiene un constructor de copia. Lo más cercano que tengo hasta ahora es:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
pero estoy seguro de que debe haber una mejor manera de hacerlo y agradecería algunos consejos.
Puedes usar el
forEach
método para hacer lo que quieras.Lo que estás haciendo allí es:
Lo que podemos simplificar en una lambda:
Y debido a que solo estamos llamando a un método existente, podemos usar una referencia de método , que nos da:
fuente
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
o podría acortar eso?new Column(column)
parámetro, tendrá que ir con eso.La forma sin volver a insertar todas las entradas en el nuevo mapa debería ser la más rápida, ya queHashMap.clone
internamente también realiza la repetición.fuente
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. No sé si es diferente bajo las sábanas.Map
comportamiento de la implementación, es decir, siMap
es unaEnumMap
o unaSortedMap
, el resultadoMap
también lo será. En el caso de unSortedMap
con un especialComparator
, puede hacer una gran diferencia semántica. Bueno, lo mismo se aplica a unIdentityHashMap
...Mantenlo simple y usa Java 8: -
fuente
Si usa Guava (v11 mínimo) en su proyecto, puede usar Maps :: transformValues .
Nota: Los valores de este mapa se evalúan perezosamente. Si la transformación es costosa, puede copiar el resultado en un nuevo mapa como se sugiere en los documentos de Guava.
fuente
To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.
Aquí hay otra forma que le da acceso a la clave y al valor al mismo tiempo, en caso de que tenga que hacer algún tipo de transformación.
fuente
Si no le importa usar bibliotecas de terceros, mi libra cyclops-react tiene extensiones para todos los tipos de colección JDK , incluido Map . Puede usar directamente los métodos de mapa o bimap para transformar su mapa. Un MapX se puede construir a partir de un mapa existente, por ejemplo.
Si también desea cambiar la clave, puede escribir
bimap se puede usar para transformar las claves y los valores al mismo tiempo.
A medida que MapX extiende el Mapa, el mapa generado también se puede definir como
fuente