关于复杂过滤器java流
我有一个关于过滤器的问题,我写了两个POJO:关于复杂过滤器java流,java,filter,java-8,java-stream,Java,Filter,Java 8,Java Stream,我有一个关于过滤器的问题,我写了两个POJO: @Getter @Setter @AllArgsConstructor @ToString class Person { private int id; private String firstName; private List<Address> address; } @Getter @Setter @AllArgsConstructor @ToString class Address { priva
@Getter
@Setter
@AllArgsConstructor
@ToString
class Person {
private int id;
private String firstName;
private List<Address> address;
}
@Getter
@Setter
@AllArgsConstructor
@ToString
class Address {
private int id;
private String street;
private String city;
}
我写了两本书:
Address address1 = new Address(1, "Main street", "London");
Address address2 = new Address(2, "Hollywood Boolevard", "Los Angeles");
Address address3=new Address(3,"Rue de la paix","Paris");
List<Person> personList = Arrays.asList(
new Person(1, "Tom", Arrays.asList(address1)),
new Person(2, "Fred", Arrays.asList(address2)),
new Person(3,"Beth",Arrays.asList(address1,address2)),
new Person(4,"Marc",Arrays.asList(address1,address3))
);
如果我想要一个所有地址的列表,它很简单
List<Address> addressList=personList.stream().map(Person::getAddress)
.flatMap(List::stream).collect(Collectors.toList());
但这是我的问题,我想要一个这个人居住的地方的列表,例如在一条包含ol的街道上,我不知道如何用java stream编写这个列表,过去我在sql中使用内部连接,但现在用java streams,我怎么能做这个请求???
感谢您的帮助您可以尝试以下方法:
personList.stream()
// filter people who has an adress that contains "ol"
// you could also create a method on Person that check if has this address to make it more readable
.filter(p -> p.getAddress()
.stream()
.anyMatch(a -> a.getStreet().contains("ol")))
.collect(Collectors.toList());
更新:
人员上的方法示例:
class Person {
// ...
public boolean livesInStreet(String street) {
return this.address.stream().anyMatch(a -> a.getStreet().contains(street));
}
}
使用新方法:
personList.stream()
.filter(p -> p.livesInStreet("ol"))
.collect(Collectors.toList());
没问题,大卫,我很乐意帮忙!