[英]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 鍵入的。
據我了解,您只想使用EmployeeId
和DepartmentId
進行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.