साथ में जावा-8, आप स्ट्रीम और 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
और मानचित्रण क्रिया करते हैं कि एक अंतर मान के लिए, इसके परिणाम की गणना करें 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));
इस कोड को चलाते समय, आपको एक त्रुटि मिलेगी 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)
आशा करता हूँ की ये काम करेगा! :)