当list<B>和list<A>以keyList进行匹配,且皮匹配到的件数比是N:M,将匹配成功的list<A>和list<B>出力。用java8写一段实现上述需求的共通方法
时间: 2024-05-09 22:21:06 浏览: 15
假设A和B都有一个名为key的属性,可以使用Java 8的Stream API来实现:
```java
public static <T, U> void matchLists(List<T> list1, List<U> list2, BiPredicate<T, U> matcher) {
Map<Object, List<T>> map1 = list1.stream().collect(Collectors.groupingBy(t -> ((T) t).getKey()));
Map<Object, List<U>> map2 = list2.stream().collect(Collectors.groupingBy(u -> ((U) u).getKey()));
map1.keySet().stream().forEach(key -> {
List<T> matches1 = map1.get(key);
List<U> matches2 = map2.get(key);
if (matches1 != null && matches2 != null) {
matches1.stream().forEach(t -> {
matches2.stream().forEach(u -> {
if (matcher.test(t, u)) {
System.out.println(t.toString() + " matches " + u.toString());
}
});
});
}
});
}
```
该方法接受两个泛型列表和一个BiPredicate函数,该函数用于在匹配时比较两个对象的属性。在方法内部,首先将两个列表转换为映射,其中键是对象的key属性,值是对象列表。然后,遍历第一个列表的键,并获得每个键的匹配列表。如果第二个映射中也有该键,则对第二个映射中该键的匹配列表进行遍历,使用BiPredicate函数比较两个对象。如果匹配,则输出结果。