Mit Java-8Sie können dies in einer Zeile mithilfe von Streams und der Collectors
Klasse tun .
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Kurze Demo:
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 + "]";
}
}
Ausgabe:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Wie in den Kommentaren erwähnt, können Sie Function.identity()
anstelle von verwenden item -> item
, obwohl ich i -> i
ziemlich explizit finde .
Um vollständig zu sein, beachten Sie, dass Sie einen binären Operator verwenden können, wenn Ihre Funktion nicht bijektiv ist. Betrachten wir zum Beispiel dies List
und die Zuordnungsfunktion, die für einen int-Wert das Ergebnis davon modulo 3 berechnet:
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));
Wenn Sie diesen Code ausführen, wird eine Fehlermeldung angezeigt java.lang.IllegalStateException: Duplicate key 1
. Dies liegt daran, dass 1% 3 gleich 4% 3 ist und daher bei gegebener Schlüsselzuordnungsfunktion denselben Schlüsselwert hat. In diesem Fall können Sie einen Zusammenführungsoperator angeben.
Hier ist eine, die die Werte summiert; (i1, i2) -> i1 + i2;
das kann durch die Methodenreferenz ersetzt werden Integer::sum
.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
welches jetzt ausgibt:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
Ich hoffe es hilft! :) :)