【问题标题】:About complex filter java stream关于复杂过滤器java流
【发布时间】:2018-07-18 07:59:17
【问题描述】:

我有一个关于过滤器的问题,我写了两个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 流编写这个,过去我在 sql 中使用了内部联接但现在有了 Java 流,我怎么能做这个请求??? 感谢您的帮助

【问题讨论】:

    标签: java filter java-8 java-stream


    【解决方案1】:

    你可以试试这个:

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

    更新: Person 上的方法示例:

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

    【讨论】:

    • 没问题,大卫,我很乐意提供帮助!
    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多