当list<B>和list<A>以多个字段为key进行匹配,将匹配成功的list<A>和list<B>出力。用java8写一段实现上述需求的共通方法
时间: 2024-05-07 22:15:18 浏览: 104
假设A和B的类定义如下:
```java
class A {
private int id;
private String name;
private int age;
// 其他字段和方法
}
class B {
private int id;
private String name;
private String gender;
// 其他字段和方法
}
```
可以定义一个通用的方法来匹配list<B>和list<A>,并将匹配成功的结果存储在一个Map中,其中key为A,value为B:
```java
public static <T, U> Map<T, U> match(List<T> list1, List<U> list2, Function<T, Object> keyExtractor1, Function<U, Object> keyExtractor2) {
Map<Object, U> map2 = list2.stream().collect(Collectors.toMap(keyExtractor2, Function.identity()));
Map<T, U> result = new HashMap<>();
for (T a : list1) {
U b = map2.get(keyExtractor1.apply(a));
if (b != null) {
result.put(a, b);
}
}
return result;
}
```
使用方法:
```java
List<A> listA = Arrays.asList(new A(1, "Alice", 20), new A(2, "Bob", 30), new A(3, "Charlie", 40));
List<B> listB = Arrays.asList(new B(1, "Alice", "F"), new B(2, "Bob", "M"), new B(4, "David", "M"));
Map<A, B> map = match(listA, listB, a -> Arrays.asList(a.getId(), a.getName()), b -> Arrays.asList(b.getId(), b.getName()));
```
上述代码使用了Java 8的Stream API和Lambda表达式来简化代码。其中,keyExtractor1和keyExtractor2分别用于从A和B中提取用于匹配的字段,使用Arrays.asList()将多个字段合并成一个List作为key。使用Function.identity()作为第二个参数,将B本身作为value存储到map2中。最后遍历list1中的每个A对象,从map2中获取匹配的B对象,如果不为null,则存储到result中。
阅读全文