在带有 lambda 参数的 lambda 中使用谓词
Using predicates in lambdas with lambda parameters
我正在尝试将对象与对象列表进行比较,以了解该特定对象是否在列表中,但是有一些规则
- 我不想覆盖任何现有方法
- 我不想使用自定义比较器
- 解决方案应该使用已经存在的谓词
代码如下:
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()
的类型,因为它用于代码的其他部分。
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));
我正在尝试将对象与对象列表进行比较,以了解该特定对象是否在列表中,但是有一些规则
- 我不想覆盖任何现有方法
- 我不想使用自定义比较器
- 解决方案应该使用已经存在的谓词
代码如下:
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()
的类型,因为它用于代码的其他部分。
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));