关于复杂过滤器java流

关于复杂过滤器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

我有一个关于过滤器的问题,我写了两个POJO:

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

没问题,大卫,我很乐意帮忙!