Java8流来查找多个值并返回布尔值

Vel*_*aga 3 java java-8 java-stream

我使用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)
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何提示都会很明显.

YCF*_*F_L 7

您可以这样使用anyMatch:

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

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

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());
Run Code Online (Sandbox Code Playgroud)

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

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

boolean isPresent = employees.containsAll(listToFind);
Run Code Online (Sandbox Code Playgroud)


Rav*_*ala 5

这是一个更具可读性的解决方案,

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();
Run Code Online (Sandbox Code Playgroud)

一个更简洁的解决方案是,

final boolean isFound = employees.stream().anyMatch(p1.or(p2));
Run Code Online (Sandbox Code Playgroud)