Avec java-8, vous pourrez le faire sur une seule ligne en utilisant des flux et la Collectors
classe.
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Démo courte:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test{
public static void main (String [] args){
List<Item> list = IntStream.rangeClosed(1, 4)
.mapToObj(Item::new)
.collect(Collectors.toList()); //[Item [i=1], Item [i=2], Item [i=3], Item [i=4]]
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
map.forEach((k, v) -> System.out.println(k + " => " + v));
}
}
class Item {
private final int i;
public Item(int i){
this.i = i;
}
public String getKey(){
return "Key-"+i;
}
@Override
public String toString() {
return "Item [i=" + i + "]";
}
}
Production:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Comme indiqué dans les commentaires, vous pouvez utiliser à la Function.identity()
place de item -> item
, bien que je trouve i -> i
plutôt explicite.
Et pour être complet, notez que vous pouvez utiliser un opérateur binaire si votre fonction n'est pas bijective. Par exemple, considérons ceci List
et la fonction de mappage que pour une valeur int, calculons le résultat de celle-ci modulo 3:
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3), i -> i));
Lors de l'exécution de ce code, vous obtiendrez une erreur indiquant java.lang.IllegalStateException: Duplicate key 1
. En effet, 1% 3 est identique à 4% 3 et a donc la même valeur de clé compte tenu de la fonction de mappage de clé. Dans ce cas, vous pouvez fournir un opérateur de fusion.
En voici un qui additionne les valeurs; (i1, i2) -> i1 + i2;
qui peut être remplacé par la référence de méthode Integer::sum
.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
qui génère désormais:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
J'espère que ça aide! :)