【问题标题】:Java8 streams to find multiple values and return booleanJava8 流查找多个值并返回布尔值
【发布时间】:2018-06-27 10:33:04
【问题描述】:

我正在使用 java-8 来查找自定义对象列表中的值。例如)

List<Employee> employees = Arrays.asList(
        new Employee("Sachin Tendulkar", 41),
        new Employee("Sachin Tendulkar", 36),
        new Employee("MS Dhoni", 34),
        new Employee("Rahul Dravid", 40),
        new Employee("Lokesh Rahul", 25),
        new Employee("Sourav Ganguly", 40)
);

要在列表中查找值,我可以使用以下查询,

boolean isPresent = employees.stream()
            .allMatch(employee -> (equalsIgnoreCase(employee.getName(),"Sachin Tendulkar") && equalsIgnoreCase(employee.getAge(),"36")));

以上工作正常。但我想找到 36 岁的“Sachin Tendulkar”和 40 岁的“Rahul Dravid”。如何在 Java8 流中实现这一点。我尝试了多个“allMatch”,但都不起作用。

任何提示都会很明显。

【问题讨论】:

  • 您想获取员工或检查它是否存在?
  • 您要检查您的列表是否包含两者?

标签: java java-8 java-stream


【解决方案1】:

你可以像这样使用anyMatch

boolean isPresent = employees.stream()
        .anyMatch(employee ->
                (employee.getName().equalsIgnoreCase("Sachin Tendulkar") && employee.getAge() == 36)
                        ||
                        (employee.getName().equalsIgnoreCase("Rahul Dravid") && employee.getAge() == 40)
        );

要获取员工列表,您可以使用:

List<Employee> result = employees.stream()
        .filter(employee ->
                (employee.getName().equalsIgnoreCase("Sachin Tendulkar") && employee.getAge() == 36)
                        ||
                        (employee.getName().equalsIgnoreCase("Rahul Dravid") && employee.getAge() == 40)
        ).collect(Collectors.toList());

或者您可以创建一个您想要查找的员工列表并使用List::containsAll,注意您必须在您的员工类中覆盖hashCodeequals 方法:

List<Employee> listToFind = Arrays.asList(
        new Employee("Sachin Tendulkar", 36),
        new Employee("Rahul Dravid", 40)
);

boolean isPresent = employees.containsAll(listToFind);

【讨论】:

  • 我已经覆盖了 hashcode 和 equals 但“containsAll”仍然对我不起作用
  • @VelNaga 你如何覆盖它以及你做了什么检查这个ideone demo了解更多细节:)
  • 我使用了 intellij equals 和 hashcode 模板来覆盖 beans
  • @VelNaga 我使用相同的 IDE 你在 ideone 链接中尝试过我的代码吗?
【解决方案2】:

这是一个更易读的解决方案,

Predicate<Employee> p1 = e -> e.getName().equals("Sachin Tendulkar") && e.getAge() == 36;
Predicate<Employee> p2 = e -> e.getName().equals("Rahul Dravid") && e.getAge() == 40;
final boolean isFound = employees.stream().filter(p1.or(p2)).findAny().isPresent();

更简洁的解决方案是,

final boolean isFound = employees.stream().anyMatch(p1.or(p2));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2023-03-28
    相关资源
    最近更新 更多