Dengan java-8, Anda dapat melakukan ini dalam satu baris menggunakan aliran , dan Collectors
kelas.
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Demo singkat:
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 + "]";
}
}
Keluaran:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Seperti disebutkan dalam komentar, Anda dapat menggunakan Function.identity()
alih-alih item -> item
, meskipun saya menemukan i -> i
agak eksplisit.
Dan untuk menjadi catatan lengkap bahwa Anda dapat menggunakan operator biner jika fungsi Anda tidak bijective. Sebagai contoh mari kita pertimbangkan ini List
dan fungsi pemetaan yang untuk nilai int, hitung hasilnya 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));
Saat menjalankan kode ini, Anda akan mendapatkan pesan kesalahan java.lang.IllegalStateException: Duplicate key 1
. Ini karena 1% 3 sama dengan 4% 3 dan karenanya memiliki nilai kunci yang sama mengingat fungsi pemetaan kunci. Dalam hal ini Anda dapat menyediakan operator gabungan.
Inilah salah satu yang menjumlahkan nilai-nilai; (i1, i2) -> i1 + i2;
yang dapat diganti dengan referensi metode Integer::sum
.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
yang sekarang menghasilkan:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
Semoga ini bisa membantu! :)