隨着java-8的方式,你就可以做到這一點,使用streams一行,並Collectors
類。
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
簡短演示:
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 + "]";
}
}
輸出:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
正如在評論中指出,你可以使用Function.identity()
代替item -> item
,雖然我覺得i -> i
相當明確。
要完整地說明,如果函數不是雙射的,可以使用二元運算符。例如,讓我們考慮這個List
和映射功能,對於一個int值,計算結果是模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));
當運行這段代碼,你會得到一個錯誤說java.lang.IllegalStateException: Duplicate key 1
。這是因爲1%3與4%3相同,因此在給定密鑰映射函數的情況下具有相同的密鑰值。在這種情況下,您可以提供合併操作符。
這是一個總結價值; (i1, i2) -> i1 + i2;
,可以用方法參考Integer::sum
代替。
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
現在輸出:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
希望它能幫助! :)
什麼是最佳最佳方式?考慮到某些參數(速度/記憶),進行優化。 – 2010-11-09 20:44:00
列表在概念上與地圖不同 - 地圖具有'關鍵,值'對的概念,而List不包含。鑑於此,目前還不清楚你將如何從列表轉換爲地圖並返回。 – 2010-11-09 20:46:57
@Daniel:通過Optimal,我的意思是在不同所有方式之間以不同方式進行這樣做的最好方式是什麼,所以最好能看到將列表轉換爲地圖的一些不同方式。 – Rachel 2010-11-09 20:50:44