Acabei de começar a olhar para o Java 8 e experimentar lambdas. Pensei em tentar reescrever uma coisa muito simples que escrevi recentemente. Preciso transformar um mapa de seqüência de caracteres em coluna em outro mapa de seqüência de caracteres em coluna onde a coluna no novo mapa é uma cópia defensiva da coluna no primeiro mapa. A coluna possui um construtor de cópias. O mais próximo que eu tenho até agora é:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
mas tenho certeza de que deve haver uma maneira melhor de fazer isso e ficaria grato por alguns conselhos.
Você pode usar o
forEach
método para fazer o que quiser.O que você está fazendo lá é:
Que podemos simplificar em um lambda:
E, como estamos chamando um método existente, podemos usar uma referência de método , o que nos fornece:
fonte
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
ou eu poderia reduzi-lo?new Column(column)
paremômetro, precisará seguir com isso.O caminho sem reinserir todas as entradas no novo mapa deve ser o mais rápidopossível, porque tambémHashMap.clone
realiza rehash internamente.fonte
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. Não sei se é diferente debaixo das cobertas.Map
comportamento da implementação, ou seja, seMap
é umEnumMap
ou aSortedMap
, o resultadoMap
também será. No caso de umSortedMap
com um especialComparator
, pode fazer uma enorme diferença semântica. Oh bem, o mesmo se aplica a umIdentityHashMap
…Mantenha-o simples e use o Java 8: -
fonte
Se você usar o Guava (mínimo da v11) em seu projeto, poderá usar o Maps :: transformValues .
Nota: Os valores deste mapa são avaliados preguiçosamente. Se a transformação for cara, você pode copiar o resultado para um novo mapa, como sugerido nos documentos do Guava.
fonte
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.
Aqui está outra maneira que fornece acesso à chave e ao valor ao mesmo tempo, caso você precise fazer algum tipo de transformação.
fonte
Se você não se importa em usar bibliotecas de terceiros, minha lib cyclops- react possui extensões para todos os tipos de coleções do JDK , incluindo o Map . Você pode usar diretamente os métodos de mapa ou bimap para transformar seu mapa. Um MapX pode ser construído a partir de um mapa existente, por exemplo.
Se você também deseja alterar a chave, pode escrever
O bimap pode ser usado para transformar as chaves e os valores ao mesmo tempo.
À medida que o MapX estende o mapa, o mapa gerado também pode ser definido como
fonte