如何用流将Arraylist <Person>转换为Map <String,List <Long >>?

时间:2019-07-19 07:41:38

标签: java java-stream

我有一个Person ArrayList

List<Person> personList = getPersonList();

我想创建一个Map<String, List<Long>>的地图

基于Person :: getDepartment的键和基于List<Long>时间戳Person::getTimestamp的值

List<Person> personList中有多个Person记录,因此我需要删除Person::getDepartment上的重复项,但是我认为,由于Map不允许键重复项,所以这应该不是问题。

我可以通过forach循环做到这一点,但是我的问题是我可以只使用一个流吗?

public class Person {

    private String department;
    private long timestamp;

    //getters and setters
}

1 个答案:

答案 0 :(得分:3)

在收集中,使用groupingBy()按部门将Person分组,然后使用mapping()Person映射到其时间戳。

Map<String, List<Long>> map = 
personList.stream()
          .collect(groupingBy(
                         Person::getDepartment,
                         mapping(Person::getTimestamp, toList())
                        )
                  );

并添加这些导入:

import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;

或者只是:

import static java.util.stream.Collectors.*;