我正在尝试将一个对象与一个对象列表进行比较,以了解该特定对象是否在列表中,但是有一些规则
以下代码:
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()
的类型,因为它已在代码的其他部分使用。
答案 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));