java - 在带有 lambda 参数的 lambda 中使用谓词

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

注意:这是显示我的问题的代码的简化版本

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

是否有一些解决方法可以调用 isEventOfCode()带有来自 lambda 表达式的参数的谓词?我无法修改 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));

关于java - 在带有 lambda 参数的 lambda 中使用谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51039697/

相关文章:

java - 使用 Java Streams 从 map 列表中提取一个键,并创建一个 map 的 map

Java 流意外结果

java - 为什么我不能使用? : operators in the 3rd argument of for loops in Java?

java - 正在生成 PDF 报告 : jFreeChart and DynamicReports

c# - Lambda表达式-参数未知吗?

QThread 和 C++11 lambda : wait for finished

c++ - 仔细检查锁定模式 - 在传递给 call_once 的 lambda 中捕获

java - Eclipse 插件不会从 RESOLVED 变为 ACTIVE

java - 用Java下载邮件附件

Java/Ubuntu - 在 main 之外打印在 Windows 上有效,但在 Ubuntu 14.04 上不执行任何操作