java8写一个按复数个key将两个类型不同的list进行match的共通方法
时间: 2024-05-15 13:15:24 浏览: 196
以下是一个Java 8实现的按复数个key将两个类型不同的list进行match的共通方法示例:
```java
import java.util.*;
import java.util.stream.*;
public class ListMatcher {
// 按多个key将两个list进行match
public static <T, U> Map<T, U> match(List<? extends T> list1, List<? extends U> list2, Function<? super T, ?>... keyExtractors) {
// 将每个key的提取函数合并成一个总的提取函数
Function<Object, List<Object>> keyExtractor = obj -> Stream.of(keyExtractors)
.map(extractor -> extractor.apply((obj instanceof T) ? obj : list2.get(list1.indexOf(obj))))
.collect(Collectors.toList());
// 逐个key进行分组,将分组结果合并成一个Map
return Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.groupingBy(keyExtractor, Collectors.collectingAndThen(
Collectors.toList(),
list -> {
if (list.size() != 2) {
throw new IllegalArgumentException("Lists are not matched: " + list);
}
return new SimpleEntry<>(list.get(0), list.get(1));
}
)));
}
// 示例
public static void main(String[] args) {
List<String> list1 = Arrays.asList("a", "b", "c");
List<Integer> list2 = Arrays.asList(1, 2, 3);
// 按每个元素本身进行match
Map<String, Integer> result1 = match(list1, list2, Function.identity());
System.out.println(result1); // {a=1, b=2, c=3}
// 按每个元素的长度进行match
Map<String, Integer> result2 = match(list1, list2, String::length, Object::hashCode);
System.out.println(result2); // {1=1, 3=3}
// 不同类型的list也可以进行match
List<Object> list3 = Arrays.asList(1, "b", 3.0);
List<Double> list4 = Arrays.asList(1.0, 2.0, 3.0);
Map<Object, Double> result3 = match(list3, list4, Object::getClass);
System.out.println(result3); // {class java.lang.Integer=1.0, class java.lang.Double=3.0}
}
}
```
该方法接收两个类型不同的list和若干个key提取函数,按每个元素的所有key提取函数的返回值组成一个总的key进行match。如果两个元素的总key相等,则将它们合并成一个Map,key为第一个list中的元素,value为第二个list中的元素。
该方法使用了Java 8的函数式编程特性,包括函数接口、lambda表达式、方法引用、流式操作等。这些特性使得代码更加简洁、可读、可维护。
阅读全文