使用Java 8将两个列表中的对象与唯一ID合并

Nic*_*k01 2 java java-8

class Human {
    Long humanId;
    String name;
    Long age;
}


class SuperHuman {
    Long superHumanId;
    Long humanId;
    String name;
    Long age;
}
Run Code Online (Sandbox Code Playgroud)

我有两个清单.人类名单和superHumans名单.我想从两个中创建一个单独的列表,确保如果一个人是超人,它只会在使用java 8的列表中出现一次.有一个巧妙的方法吗?更新:这些是不同的类,即不扩展另一个.我想最终的名单是超人.如果一个人已经是超人,我们就会忽视那个人类的对象.如果人类不是超人,我们将人类对象转换为超人类对象.理想情况下,我希望按照他们的年龄对它们进行排序,以便获得按日期降序排序的超人列表.

Pat*_*ick 6

根据您更新的问题:

List<Human> humans = ... // init 
List<SuperHuman> superHumans = ... // init

Set<Long> superHumanIds = superHumans.stream()
    .map(SuperHuman::getHumanId)
    .collect(toSet());

humans.stream()
    .filter(human -> superHumanIds.contains(human.getHumanId()))
    .map(this::convert)
    .forEach(superHumans::add);

superHumans.sort(Comparator.comparing(SuperHuman::getAge));
Run Code Online (Sandbox Code Playgroud)

假设此类具有另一个具有以下签名的方法:

private Superhuman convert(Human human) {
    // mapping logic
}
Run Code Online (Sandbox Code Playgroud)