这是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)));

10-04 18:15