java8写一个根据复数个key将两个类型不同的list进行match的共通方法
时间: 2024-05-03 22:23:05 浏览: 139
以下是一个根据复数个key将两个类型不同的list进行match的共通方法的示例代码:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ListMatcher {
public static <T, U> List<Pair<T, U>> match(List<T> list1, List<U> list2, String... keys) {
// 创建一个Map,用于存储第一个列表中每个元素的key和对应的值
Map<List<Object>, T> map = new HashMap<>();
for (T t : list1) {
List<Object> keyList = new ArrayList<>();
for (String key : keys) {
Object value = getValueByKey(t, key);
if (value != null) {
keyList.add(value);
}
}
map.put(keyList, t);
}
// 遍历第二个列表,对于每一个元素,找到对应的第一个列表中的元素,并将它们组成一对
List<Pair<T, U>> result = new ArrayList<>();
for (U u : list2) {
List<Object> keyList = new ArrayList<>();
for (String key : keys) {
Object value = getValueByKey(u, key);
if (value != null) {
keyList.add(value);
}
}
T t = map.get(keyList);
if (t != null) {
result.add(new Pair<>(t, u));
}
}
return result;
}
private static Object getValueByKey(Object obj, String key) {
// 通过反射获取对象的属性值
try {
String[] keyParts = key.split("\\.");
Object value = obj;
for (String keyPart : keyParts) {
value = value.getClass().getField(keyPart).get(value);
}
return value;
} catch (Exception e) {
return null;
}
}
public static class Pair<T, U> {
public final T left;
public final U right;
public Pair(T left, U right) {
this.left = left;
this.right = right;
}
}
}
```
该方法接受两个列表以及多个key作为参数,通过遍历这两个列表并使用反射从中提取出指定的key值,将它们匹配成一对,并将所有匹配结果组成一个新的列表返回。具体实现过程如下:
1. 首先遍历第一个列表,并根据每个元素的key值将它们存储到一个Map中,这个Map的键是一个由多个key值组成的列表,值是第一个列表中对应的元素。
2. 遍历第二个列表,对于每个元素,提取出它的key值,然后在第一个列表的Map中查找相同key值组成的列表,找到对应的元素,将它们组成一对并添加到结果列表中。
3. 返回结果列表。
该方法使用了泛型,因此可以处理不同类型的列表,而且返回的结果也是一个泛型列表。为了方便起见,我们还定义了一个Pair类,用于表示一对匹配的元素。
阅读全文