2017-08-12 64 views
2

說,還有一類,員工從對象列表創造價值的唯一列表,同時檢查空

@Getter 
Class Employee { 
    empId; 
    empName; 
    empDept; 
} 

我想從列表中獲得獨特的,部門的逗號delimetered列表在String部門的員工(例如: '銷售', '科技', '行動', '培訓')

List<Employee> employees = getListOfEmployees(); 
String departments = getUniqueDepartments(employees); 

這就是我想:

String getUniqueDepartments(final List<Employee> employees) { 
    return employees.stream().filter(emp -> emp.getEmpDept()!=null) 
         .map(emp -> String.format("'%s'", emp.getEmpDept())) 
         .collect(Collectors.joining(",")) 
} 

如何在其上添加distinct子句?

... 
... 
.map(emp -> String.format("'%s'", emp.getEmpDept())) 
.distinct() 
.collect(Collectors.joining(",")); 

回答

5

簡單地說,collect還原操作,即前添加distinct中間操作

employees 
     .stream() 
     .map(Employee::getEmpDept) 
     .filter(Objects::nonNull) 
     .map(x -> String.format("'%s'", x)) 
     .distinct() 
     .collect(Collectors.joining(",")); 

只需注意使用狀態的中間業務(如distinctsorted)將取消所有上面的操作的懶惰。一般來說,你不應該在意這一點,但要記住一件好事。

0

此外,如果你想跳過地圖操作,Collectors#joining一個重載的版本,接受前綴和後綴的參數,然後你可以有這樣的:

employees 
      .stream() 
      .map(Employee::getEmpDept) 
      .filter(Objects::nonNull) 
      .distinct() 
      .collect(Collectors.joining("','", "'", "'"))); 

跳過地圖操作。