假设我有公司部门的地图到该部门的员工记录列表。
Map<String, List<Employee>> departmentToEmployeesList = getMyMap();
Set<String> uniqueFirstNames = departmentToEmployeesList.
values()
.stream()
.collect(HashSet::new, HashSet::addAll, HashSet::addAll)
.stream()
.map(employee -> ((Employee)employee).getFirstName())
.collect(Collectors.toSet());
上面的代码有效,但我不希望有((Employee)employee)
强制转换。如果没有强制转换,地图调用只会认为每个参数都是Object
而不是Employee
。
我们可以将它分成两个调用:
HashSet<Employees> flattenedEmployees = departmentToEmployeesList.
values()
.stream()
.collect(HashSet::new, HashSet::addAll, HashSet::addAll);
Set<String> uniqueFirstNames = flattenedEmployees
.stream()
.map(Employee::getFirstName)
.collect(Collectors.toSet());
现在我们不必进行强制转换,HashSet知道它的类型为Employee
。
有没有办法将类型信息传递给HashSet::new
来电中的collect
?我只是以错误的方式解决这个问题吗?
答案 0 :(得分:4)
您可以使用HashSet<Employee>::new
。
但我宁愿重构您的代码以使用flatMap:
Set<String> uniqueFirstNames =
departmentToEmployeesList.values()
.stream()
.flatMap(List::stream)
.map(Employee::getFirstName)
.collect(toSet());