Потоки Java8 для поиска нескольких значений и возврата логического значения - PullRequest
0 голосов
/ 27 июня 2018

Я использую 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 лет и «Рахул Дравид» с 40. Как этого добиться в потоках Java8. Я пробовал несколько "allMatch", но это не работает.

Любой намек будет заметен.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вот более читаемое решение,

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));
0 голосов
/ 27 июня 2018

Вы можете использовать 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 метод в вашем классе Employee:

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

boolean isPresent = employees.containsAll(listToFind);
...