我已遵循此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
答案 0 :(得分:1)
似乎类型推断正在趋于平缓。您可以自己指定参数类型,如下所示:
compareLists(list1, list2,
(Foo1 item1, Foo2 item2) ->
item1.someField11.equals(item1.someField21) && item1.someField12.equals(item1.someField22)
)