Java 将BiPredicate作为函数参数传递

Java 将BiPredicate作为函数参数传递,java,Java,我按照这个方法检查了基于相同字段的两个不同类型的列表是否相等 工作功能如下: private <T, U> boolean compareLists(List<T> list1, List<U> list2, BiPredicate<T, U> predicate) { return list1.size() == list2.size() && list1.stream().allMatc

我按照这个方法检查了基于相同字段的两个不同类型的列表是否相等

工作功能如下:

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)));
}
我无法解析符号“someField11”,其他字段的解析方式相同

我不得不这样宣布,贝娄,使它的工作

BiPredicate<Foo1, Foo2> biPredicate = (item1, item2) ->
                    item1.someField11.equals(item1.someField21) &&  item1.someField12.equals(item1.someField22)
那么,如何在没有额外的局部变量biPredicate的情况下使其工作呢

更新解决方案
list1是Set not List的类型,因此我将函数签名更改为Collection

似乎类型推断失败了。您可以自己指定参数类型,如下所示:

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

我刚刚解决了这个问题,list1是Set而不是List的类型,所以我将函数签名改为Collections,但感谢我自己指定参数类型的技巧,我不知道如果编译器无法正确推断类型,我们可以这样做,这是因为上下文不允许它。我只能猜测list1和list2没有使用正确的泛型参数声明。请添加声明它们的方式。@ernest_k是的,这是相同的问题,但不是泛型,我是用Set not List调用函数的
compareLists(list1, list2,
        (Foo1 item1, Foo2 item2) ->
                item1.someField11.equals(item1.someField21) &&  item1.someField12.equals(item1.someField22)
)