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



我有一个DTO,看起来像-

@Getter
@Builder
class Person{
private String id;
private String name;
private Integer age;
}

一个新的数组列表被创建为-

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());

另一个列表作为-存在

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

在Java 8中获得persons的子集的最佳方法是什么,其中person.id().equals(age.id())用于persons中的每个项personages中的age

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

Set<String> ageIds = ages.stream().map(Person::getId).collect(Collectors.toSet());

此外,如果上面设置了contains的id,则使用它来基于查询过滤结果子集中的每个人项目。

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

您也可以使用两个流:

public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("001", "alpha", 22));
persons.add(new Person("002", "beta", 49));
persons.add(new Person("003", "gamma", 37));
List<Person> ages = new ArrayList<Person>();
ages.add(new Person("001", "alpha", 22));
ages.add(new Person("002", "beta", 49));
// stream the persons
Set<Person> subset = persons.stream()
// and filter by anything of the stream of ages
.filter(p -> ages.stream()
// that matches the id of the current Person
.anyMatch(a -> a.getId().equals(p.getId()))
)
// collect them in a Set
.collect(Collectors.toSet());
subset.forEach(System.out::println);
}

我的系统输出:

[001, alpha, 22]
[002, beta, 49]

使用正确的toString()方法,当然…

最新更新