Поиск в списке с помощью Java Stream с использованием нескольких фильтров - PullRequest
0 голосов
/ 11 января 2019

У меня есть список объектов Java (предположим, получатели и установщики):

Record(String name, String part, String value);

Мне нужно вернуть логическое значение, если список содержит определенное значение name и определенное значение part.

У меня работает один фильтр за раз:

//assume records are added to this list
List<Record> masterList = new ArrayList<Record>();

boolean check = masterList.stream().map(Record::getName).filter(record.getName()::equals).findFirst().isPresent();

Но я получаю ошибку Non-static method cannot be referenced from a static context на Record::getPart за эту попытку:

masterList.stream().map(Record::getName).filter(record.getName()::equals).map(Record::getPart).filter(record.getPart()::equals).findFirst().isPresent();

1 Ответ

0 голосов
/ 11 января 2019

То, что вы пытаетесь сделать, просто невозможно, т. Е. Когда вы выполняете map(Record::getName), у вас есть Stream<String>, где все строки являются именами записей, а любые вызовы метода после этого основаны только на именах записей.

вместо этого просто используйте один filter:

boolean check = masterList.stream()
                           .filter(s -> s.getName().equals(record.getName()) &&
                                        s.getPart().equals(record.getPart()))
                           .findFirst().isPresent();

или лучше использовать anyMatch

boolean check = masterList.stream()
                         .anyMatch(s -> s.getName().equals(record.getName()) &&
                                    s.getPart().equals(record.getPart()));

Изменить:

если это может быть одно совпадающее имя записи и другая совпадающая часть записи?

Затем вы можете собрать все имена и части записей в набор следующим образом:

Set<String> container = masterList.stream()
                                  .flatMap(r -> Stream.of(r.getName(), r.getPart()))
                                  .collect(toSet());

Затем выполните:

boolean result = container.contains(record.getName()) && 
                 container.contains(record.getPart()) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...