在具有lambda参数的lambda中使用谓词

时间:2018-06-26 09:41:37

标签: java lambda java-8 predicate

我正在尝试将一个对象与一个对象列表进行比较,以了解该特定对象是否在列表中,但是有一些规则

  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();
}

注意:这是简化代码,以显示我的问题

现在是问题,我在此lambda中有这个code -> isEventOfCode().test(event,code),我无法针对isEventOfCode谓词测试值,因为Wrong 2nd argument type. Found: '<lambda parameter>', required: 'java.lang.String'尽管我知道PREDEFINED_CODES是一个列表的字符串,因此code的类型为String

是否有一些变通方法,可使用lambda表达式中的参数调用isEventOfCode()谓词?我无法修改isEventOfCode()的类型,因为它已在代码的其他部分使用。

1 个答案:

答案 0 :(得分:4)

findAny() takes no argument-因此,通常在具有过滤器的流上使用它,以检查过滤后是否还有任何元素。在您的示例中,您将使用:

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

但是对于您的用例来说,to use anyMatch instead更有意义:

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