【问题标题】:Java 8 get all employee having address start with PJava 8 让所有地址以 P 开头的员工
【发布时间】:2020-04-05 17:15:18
【问题描述】:

我的员工和地址类别如下

class Employee {
    private String name;
    private int age;
    private List<Address> addresses;
    //getter and setter
}

class Address {
    private String city;
    private String state;
    private String country;
    //getter and setter
}

使用 java 8 过滤器我想打印所有城市以 P 开头的员工

在下面的代码中添加什么来获取该过滤地址的 emp

employees.stream()
    .map(Employee::getAddresses)
    .flatMap(Collection::stream)
    .filter(children -> children.getCity().startsWith("p"))
    .collect(Collectors.toList())
    .forEach(System.out::println);

提前致谢。

【问题讨论】:

  • 那么不要在地址上进行平面映射。如果你想留住你的员工,你应该在地址上进行另一个流

标签: java filter java-8 java-stream


【解决方案1】:

filter 中使用anyMatch 而不是mapping:

employees.stream()
         .filter(employee -> employee.getAddresses().stream()
                 .anyMatch(adr -> adr.getCity().startsWith("p")))
         .forEach(System.out::println); // collecting not required to use forEach

【讨论】:

  • OP可以不用.collect(Collectors.toList())
【解决方案2】:

如果您想打印地址通过您的过滤条件的Employees,则不应将Employee 实例映射到它们的地址:

employees.stream()
         .filter(e -> e.getAddresses()
                       .stream()
                       .anyMatch(addr -> addr.getCity().startsWith("p")))
         .forEach(System.out::println);

请注意,如果您对List 所做的只是用forEach 对其进行迭代,则没有理由将Stream 收集到List 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多