代码之家  ›  专栏  ›  技术社区  ›  VelNaga

java8流以查找多个值并返回布尔值

  •  3
  • VelNaga  · 技术社区  · 7 年前

    我使用Java-8在自定义对象列表中查找值。对于Ex)

    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”,但没用。

    任何暗示都是可以理解的。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Youcef LAIDANI    7 年前

    你可以用 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 ,注意您必须重写 hashCode equals 员工类中的方法:

    List<Employee> listToFind = Arrays.asList(
            new Employee("Sachin Tendulkar", 36),
            new Employee("Rahul Dravid", 40)
    );
    
    boolean isPresent = employees.containsAll(listToFind);
    
        2
  •  2
  •   Ravindra Ranwala    7 年前

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

    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));
    
    推荐文章