在Java 8中的标识字段上查找数组列表的子集

Abh*_*dan 3 java java-8 java-stream

我有一个DTO看起来像-

@Getter
@Builder
class Person{
    private String id;
    private String name;
    private Integer age;
}
Run Code Online (Sandbox Code Playgroud)

创建一个新的arraylist为-

List<Person> persons = new ArrayList<Person>();
persons.add(Person.builder().id("001").name("alpha").build());
persons.add(Person.builder().id("002").name("beta").build());
persons.add(Person.builder().id("003").name("gamma").build());
Run Code Online (Sandbox Code Playgroud)

另一个列表存在-

List<Person> ages = new ArrayList<Person>();
ages.add(Person.builder().id("001").age(25).build());
ages.add(Person.builder().id("002").age(40).build());
Run Code Online (Sandbox Code Playgroud)

什么是Java中8得到的一个子集的最佳方式persons,其中person.id().equals(age.id())每个项目personpersons,并ageages

Nam*_*man 6

您可以创建集合中Set人员的ID ages

Set<String> ageIds = ages.stream().map(Person::getId).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

进一步,如果上面设置contains了ID ,则使用它根据查询过滤结果子集中的每个人项目。

List<Person> subset = persons.stream()
        .filter(p -> ageIds.contains(p.getId()))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)