Với java-8, bạn sẽ có thể thực hiện việc này trong một dòng bằng cách sử dụng luồng và Collectors
lớp.
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Bản demo ngắn:
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 + "]";
}
}
Đầu ra:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Như đã lưu ý trong các bình luận, bạn có thể sử dụng Function.identity()
thay vì item -> item
, mặc dù tôi thấy i -> i
khá rõ ràng.
Và để được lưu ý đầy đủ rằng bạn có thể sử dụng toán tử nhị phân nếu chức năng của bạn không phải là tính từ. Ví dụ, hãy xem xét điều này List
và hàm ánh xạ cho một giá trị int, tính kết quả của nó theo 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));
Khi chạy mã này, bạn sẽ gặp lỗi java.lang.IllegalStateException: Duplicate key 1
. Điều này là do 1% 3 giống với 4% 3 và do đó có cùng giá trị khóa được cung cấp cho hàm ánh xạ khóa. Trong trường hợp này, bạn có thể cung cấp một toán tử hợp nhất.
Đây là một tổng hợp các giá trị; (i1, i2) -> i1 + i2;
có thể được thay thế bằng tham chiếu phương thức Integer::sum
.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
mà bây giờ đầu ra:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
Hy vọng nó giúp! :)