Использование предикатов в лямбдах с параметрами лямбды - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь сравнить объект со списком объектов, чтобы узнать, есть ли этот конкретный объект в списке, однако есть некоторые правила

  1. Я не хочу переопределять существующие методы
  2. Я не хочу использовать пользовательские компараторы
  3. Решение должно использовать уже существующие предикаты

Код ниже:

List<String> PREDEFINED_CODES = Arrays.asList(PredefinedCodes.1, PredefinedCodes.2, PredefinedEventSetupCodes.3, PredefinedEventSetupCodes.4);

private BiPredicate<Event, String> isEventOfCode(){
    return (event, code) -> code.equals(event.getCode());
}

private Predicate<Event> isEvendPredefined(){
    return event -> PREDEFINED_CODES.stream().findAny(code -> isEventOfCode().test(event,code)).isPresent();
}

Примечание. Это упрощенная версия кода, показывающая мою проблему

Теперь проблема, у меня есть это code -> isEventOfCode().test(event,code) в этой лямбде. Я не могу проверить значения по отношению к предикату isEventOfCode, потому что Wrong 2nd argument type. Found: '<lambda parameter>', required: 'java.lang.String', хотя я знаю, что PREDEFINED_CODES - это список строк, поэтому code - это типа String

Есть ли обходной путь для вызова предиката isEventOfCode() с параметром из лямбда-выражения? Я не могу изменить тип isEventOfCode(), поскольку он используется в других частях кода.

1 Ответ

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

findAny() не принимает аргументов - поэтому вы обычно используете его в потоке с фильтром, чтобы проверить, остались ли какие-либо элементы после фильтрации. В вашем примере вы бы использовали:

return event -> PREDEFINED_CODES.stream().filter(code -> isEventOfCode().test(event,code))
                                         .findAny().isPresent();

Но для вашего случая использования было бы более разумно использовать anyMatch вместо :

return event -> PREDEFINED_CODES.stream().anyMatch(code -> isEventOfCode().test(event,code));
...