如何在Java 8中將List轉換為Map?

banq發表於2018-11-13

假設有一個員工物件:

public class Employee {
 
    // member variables
    private int empId;
    private String empName;
    private int empAge;
    private String empDesignation;


將這個員工物件放入LIst集合,如何轉為Map? 首先要明確Map的key是什麼?

1. 比如式樣員工物件的empId作為key,值是員工姓名:

 // convert List<Employee> to Map<empId, empName> using Java 8 Streams
 Map<Integer, String> mapOfEmployees = employees.stream().collect(
        Collectors.toMap(e -> e.getEmpId(),e -> e.getEmpName()));

 
2.Map的Key是empId,整個物件為Map的值:

 // convert List<Employee> to Map<empId, empName> using Java 8 Streams
Map<Integer, Employee> mapOfEmployees = employees.stream().collect(
                Collectors.toMap( e -> e.getEmpId(),  e -> e));



3. 如果List中有重複的empId,對映到Map時,Key時不能重複的,如何解決?
預設情況時會拋重複異常,為了克服IllegalStateException重複鍵異常,我們可以簡單地新增一個
BinaryOperator方法到toMap()中,這也稱為合併功能,比如如果重複,可以取第一個元素:
 Map<Integer, String> mapOfEmployees = employees.stream().collect(
                Collectors.toMap(
                        e -> e.getEmpId(), 
                        e -> e.getEmpName(), 
                        (e1, e2) -> e1 )); // Merge Function

 
4. 將List轉換為Map - 使用TreeMap對鍵進行自然排序,或者指定的Map實現呢?

 Map<Integer, String> mapOfEmployees = employees.stream().collect(
                Collectors.toMap(
                        e -> e.getEmpId(), 
                        e -> e.getEmpName(), 
                        (e1, e2) -> e1 , // Merge Function
                        TreeMap<Integer, String>::new)); // Map Supplier


如果你的TreeMap實現需要加入比較器,將上面程式碼中TreeMap<Integer, String>::new替換成:

() -> new TreeMap<Integer, String>(new MyComparator())

 

相關文章