Với java-8, bạn sẽ có thể làm điều này trong một dòng sử dụng streams, và lớp Collectors
.
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 + "]";
}
}
Output:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Như đã nêu trong bình luận, bạn có thể sử dụng Function.identity()
thay vì item -> item
, mặc dù tôi tìm i -> i
khá rõ ràng.
Và lưu ý đầy đủ rằng bạn có thể sử dụng toán tử nhị phân nếu hàm của bạn không phải là tính từ. Ví dụ chúng ta hãy xem xét các chức năng này List
lập bản đồ đó cho một giá trị int, tính toán kết quả của nó 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ẽ nhận được một lỗi nói java.lang.IllegalStateException: Duplicate key 1
. Điều này là do 1% 3 là giống như 4% 3 và do đó có cùng một giá trị quan trọng cho chức năng ánh xạ khóa. Trong trường hợp này, bạn có thể cung cấp toán tử hợp nhất.
Dưới đây là tổng hợp các giá trị; (i1, i2) -> i1 + i2;
có thể 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ờ kết quả đầu ra:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
Hy vọng nó sẽ giúp! :)
Cách tối ưu nhất là gì? Tối ưu hóa được thực hiện với một số tham số (tốc độ/bộ nhớ) nhất định. –
Danh sách khác với Bản đồ theo cách khái niệm - Bản đồ có khái niệm về cặp 'khóa, giá trị', trong khi Danh sách thì không. Do đó, không rõ chính xác bạn sẽ chuyển đổi từ Danh sách thành Bản đồ và quay lại như thế nào. –
@Daniel: Bởi tối ưu, tôi có nghĩa là cách tốt nhất để làm như vậy trong số tất cả các cách khác nhau giữa không chắc chắn của tất cả các cách và vì vậy nó sẽ là tốt để xem một số cách khác nhau của chuyển đổi danh sách để bản đồ. – Rachel