Java 8 如何转换列表<;人>;进入地图<;字符串,列表<;员工>&燃气轮机;

Java 8 如何转换列表<;人>;进入地图<;字符串,列表<;员工>&燃气轮机;,java-8,java-stream,Java 8,Java Stream,这是一段用Java7编写的代码,我想通过使用Streams和Lambdas将其转换为Java8 public static Map<String, List<Employee>> getEmployees(List<Person> personList) { Map<String, List<Employee>> result = new HashMap<>(); for (Person pe

这是一段用Java7编写的代码,我想通过使用Streams和Lambdas将其转换为Java8

public static Map<String, List<Employee>> getEmployees(List<Person> personList) {
        Map<String, List<Employee>> result = new HashMap<>();
        for (Person person : personList) {
            String[] perArr = person.getName().split("-");
            List<Employee> employeeList = result.get(perArr[0]);
            if (employeeList == null) {
                employeeList = new ArrayList<>();
            }
            employeeList.add(new Employee(person.getPersonId(), perArr[1]));
            result.put(perArr[0], employeeList);
        }

        return result;

    }
公共静态映射getEmployees(列表个人列表){
映射结果=新的HashMap();
for(个人:个人列表){
字符串[]perArr=person.getName().split(“-”);
List employeeList=result.get(perArr[0]);
如果(employeeList==null){
employeeList=新的ArrayList();
}
add(新员工(person.getPersonId(),perArr[1]);
结果。put(perArr[0],员工列表);
}
返回结果;
}

我想说,您在某种程度上很接近,问题是您需要将3件事情传递到流管道的下一个阶段:第一个令牌和第二个令牌(来自
拆分(“-”
),还有
person::getPersonId
;我在这里使用了一个
列表
,并为此使用了一些铸造(您可以使用
三元组
,例如,我听说apache有它):


改进循环的一个简单方法是使用
Map.computeIfAbsent
管理新映射项的创建:

for (Person person : personList) {
    String[] perArr = person.getName().split("-");
    List<Employee> employeeList = result.computeIfAbsent(perArr[0], x -> new ArrayList<>());
    employeeList.add(new Employee(person.getPersonId(), perArr[1]));
}

你的问题是什么?到目前为止,您尝试了什么?我能够将列表转换为映射,但无法编写映射。下面是我编写的一段代码:Map result=personList.stream().Map(s->s.getName().split(“-”).collect(Collectors.groupby(a->a[0],Collectors.mapping(a->a[1],Collectors.toList());不要将此代码作为注释发布。把它包括在你的问题中。你可以这样做。这不是流的最佳任务。Misha已经提供了最好的答案。但是你正在做两次分割,你可以随身携带这些。。。通过一个
列表
或一个
三元组
,就像我说的,“要么用中间对象把事情复杂化,要么就把字符串再次拆分”。如果您开始创建中间
列表
元组
,那么最好只使用普通的
进行
循环。您可以简单地链接
添加
调用:
结果.computeIfAbsent(perArr[0],x->new ArrayList()).add(新员工(person.getPersonId(),perArr[1])
@Holger我觉得在
map
函数中明确显示类型更有指导意义。您可以在右侧构建
Employee
。然后,您只需要一对(并且可以使用
Map.Entry
)。
for (Person person : personList) {
    String[] perArr = person.getName().split("-");
    List<Employee> employeeList = result.computeIfAbsent(perArr[0], x -> new ArrayList<>());
    employeeList.add(new Employee(person.getPersonId(), perArr[1]));
}
import static java.util.stream.Collectors.*;

personList.stream()
    .collect(groupingBy(
                p -> p.getName().split("-")[0],
                mapping(
                    p -> new Employee(p.getPersonId(), p.getName().split("-")[1]),
                    toList()
                )
    ));