java8写一个按多个key对两个类型不同的list进行match的共通方法
时间: 2024-05-05 13:17:09 浏览: 73
以下是一个按多个key对两个类型不同的list进行match的通用方法的示例代码:
```java
import java.util.*;
public class ListMatcher {
/**
* 根据多个key对两个类型不同的list进行match
* @param list1 第一个list
* @param list2 第二个list
* @param keys 匹配的key列表
* @param <T> 第一个list的元素类型
* @param <U> 第二个list的元素类型
* @return 匹配结果的Map,key为第一个list的元素,value为第二个list的元素
*/
public static <T, U> Map<T, U> matchLists(List<T> list1, List<U> list2, String... keys) {
Map<T, U> resultMap = new HashMap<>();
Map<List<Object>, U> map2 = new HashMap<>();
for (U element2 : list2) {
List<Object> keyList = new ArrayList<>();
for (String key : keys) {
try {
keyList.add(element2.getClass().getMethod("get" + key.substring(0, 1).toUpperCase() + key.substring(1)).invoke(element2));
} catch (Exception e) {
e.printStackTrace();
}
}
map2.put(keyList, element2);
}
for (T element1 : list1) {
List<Object> keyList = new ArrayList<>();
for (String key : keys) {
try {
keyList.add(element1.getClass().getMethod("get" + key.substring(0, 1).toUpperCase() + key.substring(1)).invoke(element1));
} catch (Exception e) {
e.printStackTrace();
}
}
resultMap.put(element1, map2.get(keyList));
}
return resultMap;
}
}
```
这个方法接受两个类型不同的list和一个可变长度的key列表,并返回一个匹配结果的Map,其中key为第一个list的元素,value为第二个list的元素。
在方法中,我们首先创建了一个map2来存储第二个list的元素,key为指定的key列表,value为元素本身。然后遍历第一个list的元素,获取指定key的值,并根据这些值在map2中查找匹配的元素,将结果存储在返回的Map中。
要使用这个方法,只需要将两个list和key列表传递给它即可:
```java
List<Person> list1 = new ArrayList<>();
list1.add(new Person("Alice", 25));
list1.add(new Person("Bob", 30));
list1.add(new Person("Charlie", 35));
List<Employee> list2 = new ArrayList<>();
list2.add(new Employee("Alice", "Manager"));
list2.add(new Employee("Bob", "Engineer"));
list2.add(new Employee("David", "Sales"));
Map<Person, Employee> resultMap = ListMatcher.matchLists(list1, list2, "Name");
for (Person key : resultMap.keySet()) {
System.out.println(key + " matches " + resultMap.get(key));
}
```
输出:
```
Person [Name=Alice, Age=25] matches Employee [Name=Alice, Title=Manager]
Person [Name=Bob, Age=30] matches Employee [Name=Bob, Title=Engineer]
Person [Name=Charlie, Age=35] matches null
```
阅读全文