将BiPredicate作为函数参数传递

时间:2020-04-29 05:11:27

标签: java

我已遵循此answer来检查基于相同字段的两个不同类型的列表是否相等。

这是工作功能:

private <T, U> boolean compareLists(List<T> list1, List<U> list2, BiPredicate<T, U> predicate) {

    return list1.size() == list2.size() &&
                list1.stream().allMatch(itme1 -> list2.stream().anyMatch(item2 -> predicate.test(itme1, item2)));
}

但是当我这样称呼

compareLists(list1, list2,
        (item1, item2) ->
                item1.someField11.equals(item1.someField21) &&  item1.someField12.equals(item1.someField22)
)

我得到了Cannot resolve symbol 'someField11'(与其他字段相同)

为了使它正常工作,我不得不以这种方式声明它

BiPredicate<Foo1, Foo2> biPredicate = (item1, item2) ->
                    item1.someField11.equals(item1.someField21) &&  item1.someField12.equals(item1.someField22)

那么如何使其在没有额外的局部变量biPredicate的情况下工作呢?

  • 更新解决方案

list1的类型为Set,而不是List,所以我将函数签名更改为Collection

1 个答案:

答案 0 :(得分:1)

似乎类型推断正在趋于平缓。您可以自己指定参数类型,如下所示:

compareLists(list1, list2,
        (Foo1 item1, Foo2 item2) ->
                item1.someField11.equals(item1.someField21) &&  item1.someField12.equals(item1.someField22)
)
相关问题