【问题标题】:Using predicates in lambdas with lambda parameters在带有 lambda 参数的 lambdas 中使用谓词
【发布时间】:2018-06-26 09:41:36
【问题描述】:

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

  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 -&gt; isEventOfCode().test(event,code) 我无法针对 isEventOfCode 谓词测试值,因为 Wrong 2nd argument type. Found: '&lt;lambda parameter&gt;', required: 'java.lang.String' 尽管我知道 PREDEFINED_CODES 是一个字符串列表,因此 code 是类型为String

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

【问题讨论】:

  • 但是这个BiPredicate&lt;Event, String&gt;返回方法有什么好处呢?如果要封装code.equals(event.getCode())操作,可以使用普通方法。
  • @Holger 这用于代码的其他部分以订购一些条件,并且由于比较这两个值的逻辑已经到位,因此没有必要创建专用方法,也如问题所述,这是比较的简化版

标签: java lambda java-8 predicate


【解决方案1】:

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

【讨论】:

  • 当然,这是正确的答案。我把 findAny() 和 anyMatch() 混在一起了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多