在收集

时间:2017-04-13 18:27:35

标签: java-8 java-stream

假设我有公司部门的地图到该部门的员工记录列表。

              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?我只是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

您可以使用HashSet<Employee>::new

但我宁愿重构您的代码以使用flatMap:

Set<String> uniqueFirstNames = 
    departmentToEmployeesList.values()
        .stream()
        .flatMap(List::stream)
        .map‌​(Employee::getFirstN‌​ame)
        .collect(toSet()‌​);