我有一个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
中的每个项person
和ages
中的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()
方法,当然…