সঙ্গে জাভা-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
এবং ম্যাপিং ফাংশনটি বিবেচনা করুন যে কোনও পূর্ব মানের জন্য, এটির ফলাফলটি গণনা করুন 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)
আশা করি এটা সাহায্য করবে! :)