有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

仅从java对象列表中筛选所需的重复记录(版本小于8)

我必须从对象列表中筛选重复项,这很容易。但是,在过滤重复项时,我有一个内部条件。这是我的密码

List<Person> personsList = Arrays.asList(
                new Person(ID: 1234, dateOfJoin: new Date("2020-08-31 17:32:46"), status: 'Accepted'),
                new Person(ID: 1234, dateOfJoin: new Date("2020-08-31 17:30:49"), status: 'Rejected'),
                new Person(ID: 3456, dateOfJoin: new Date("2020-08-29 13:23:34"), status: 'Waiting'));

我必须过滤ID相等的PersonList,并且我必须获得最近的dateOfJoin个人。因此,我的最终筛选列表如下所示

List<Person> filteredPersonsList = Arrays.asList(
                    new Person(ID: 1234, dateOfJoin: new Date("2020-08-31 17:30:49"), status: 'Rejected'),
                    new Person(ID: 3456, dateOfJoin: new Date("2020-08-29 13:23:34"), status: 'Waiting'));

我怎样才能过滤这个?有什么建议吗

谢谢


共 (2) 个答案

  1. # 1 楼答案

    假设有相应的getter看起来像这样

        Collection<Person> result = personList.stream()
            .collect(Collectors.groupingBy(
                         Person::getId,
                         Collectors.collectingAndThen(
                             Collectors.maxBy(Comparator.comparing(Person::getDateOfJoin),
                             Optional::get)))
            .values();
    

    不幸的是,maxBy返回Optional,需要进一步展开

  2. # 2 楼答案

    可以使用toMapmaxBy获得具有相同id的maxdateOfJoin,并在ArrayList中获取映射的值

    List<Person> filteredPersonsList = 
            new ArrayList<>(personsList
                  .stream()
                  .collect(Collectors.toMap(Person::getID, Function.identity(),
                        BinaryOperator.maxBy(Comparator.comparing(Person::getDateOfJoin))))
                  .values());