Z java-8, będziesz mógł to zrobić w jednym wierszu za pomocą strumieni i Collectorsklasy.
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Krótkie 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 + "]";
}
}
Wynik:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Jak zauważono w komentarzach, możesz użyć Function.identity()zamiast item -> item, chociaż uważam, że jest to i -> idość wyraźne.
Aby być kompletnym, pamiętaj, że możesz użyć operatora binarnego, jeśli twoja funkcja nie jest bijective. Rozważmy na przykład to Listi funkcję mapowania, która dla wartości int oblicza wynik 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));
Podczas uruchamiania tego kodu pojawi się komunikat o błędzie java.lang.IllegalStateException: Duplicate key 1. Wynika to z faktu, że 1% 3 jest taki sam jak 4% 3, a zatem mają tę samą wartość klucza, biorąc pod uwagę funkcję mapowania klucza. W takim przypadku możesz podać operator scalania.
Oto suma wartości; (i1, i2) -> i1 + i2;które można zastąpić referencją do metody Integer::sum.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
która teraz generuje:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
Mam nadzieję, że to pomoże! :)