2017-08-12 63 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("','", "'", "'"))); 

跳过地图操作。