簡體   English   中英

按多個字段的 object 列表分組 Java 8

[英]Group By List of object on multiple fields Java 8

我將有一個 Employee 列表,其中包含 3 個屬性——departmentId、employeeId、employeeGroup。

我想對部門 ID 和員工 ID 執行分組。 這個想法是發送員工所屬部門的組名。 以下可能是 3 種可能的情況:

案例#1:同一個部門,不同的員工,不同的組。

["Dept001", 100, "Admin"]
["Dept001", 101, "Contrator"]

案例2:同一個部門,同一個員工,不同的組

["Dept001", 100, "Admin"]
["Dept001", 100, "Contrator"]

案例#3:不同部門,不同員工,同一組。

["Dept001", 100, "Admin"]
["Dept002", 101, "Admin"]

我在下面嘗試過:

Map<String, Set<Employee>> map = new TreeMap<>();

map = myList.stream().collect(Collectors.groupingBy(Employee::getDepartmentId, 
Collectors.toSet()));

按多個字段分組將需要多次調用Collectors#groupingBy 幸運的是,重載的Collectors#groupingBy方法的第二個參數是另一個Collector ,因此可以簡單地調用它兩次。

Map<String, Map<Integer, Set<Employee>>> map = myList.stream()
    .collect(Collectors.groupingBy(Employee::getDepartmentId, 
        Collectors.groupingBy(Employee::getEmployeeId, Collectors.toSet())));

注意Map的值是另一個Map 第一個是用員工的部門 ID 鍵入的,第二個是用員工的員工 ID 鍵入的。

據我了解,您只想使用EmployeeIdDepartmentId進行groupBy ,以便之后您可以唯一地識別具有此組合屬性的員工。

您可以使用stream結合Tuple ,代碼將如下所示:

Map<Tuple, List<Emplyee>> map = employees.stream().collect(groupingBy(employee-> new Tuple(employee.getEmployeeId(), employee.getDepartmentId())));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM