这是Person
类
public class Person {
private String department;
private long timestamp;
//getters and setters
}
我正在尝试使用
Map
将它们收集到groupingBy
中Map<String, List<Long>> map =
personList.stream()
.collect(groupingBy(
Person::getDepartment,
mapping(Person::getTimestamp, toList())
)
);
该映射的值为
List<Long>
,我想删除重复项并对这些列表进行排序。因此,我使用了collectingAndThen,但是它不起作用并给出了错误。Map<String, List<Long>> map =
personList.stream()
.collect(groupingBy(
Person::getDepartment,
mapping(Person::getTimestamp, collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparingLong(Person::getTimestamp))),
ArrayList::new))));
怎么了
最佳答案
您要收集到Map<String, List<Long>>
列表为Long
类型的列表,因此无法使用Person::getTimestamp
对列表进行排序。由于默认情况下使用的是TreeSet
,它将根据其元素的自然顺序进行排序。
Map<String, List<Long>> map1 = personList.stream()
.collect(Collectors.groupingBy(Person::getDepartment,
Collectors.mapping(Person::getTimestamp,
Collectors.collectingAndThen(
Collectors.toCollection(TreeSet::new),
ArrayList::new))));
转换
TreeSet
是因为它会删除重复项,并且默认情况下会根据其元素的自然顺序进行排序。Map<String, Set<Long>> map = personList.stream()
.collect(Collectors.groupingBy(Person::getDepartment, Collectors.mapping(Person::getTimestamp,
Collectors.toCollection(TreeSet::new)));