当List<A>和List<B>以多个字段进行match,将match成功的List<A>和List<B>分别出力。用java8写一个共通方法
时间: 2024-05-14 11:15:04 浏览: 107
可以使用Java 8的Stream API来实现这个共通方法。核心思路是将两个列表转换为Map,以多个字段作为key,并将结果保存在一个Map中。然后使用Stream API中的filter和map方法来过滤出匹配的元素,并将它们分别放入新的List中返回。
下面是一个可能的实现:
```java
import java.util.*;
import java.util.stream.Collectors;
public class ListMatcher {
public static <A, B> Map<List<Object>, A> toMap(List<A> list, Function<A, List<Object>> keyExtractor) {
return list.stream().collect(Collectors.toMap(keyExtractor, a -> a));
}
public static <A, B> List<Pair<A, B>> match(List<A> listA, List<B> listB, Function<A, List<Object>> keyExtractorA, Function<B, List<Object>> keyExtractorB) {
Map<List<Object>, A> mapA = toMap(listA, keyExtractorA);
Map<List<Object>, B> mapB = toMap(listB, keyExtractorB);
List<Pair<A, B>> result = new ArrayList<>();
for (Map.Entry<List<Object>, A> entryA : mapA.entrySet()) {
List<Object> keyA = entryA.getKey();
A valueA = entryA.getValue();
B valueB = mapB.get(keyA);
if (valueB != null) {
result.add(new Pair<>(valueA, valueB));
}
}
return result;
}
public static void main(String[] args) {
List<Person> listA = Arrays.asList(
new Person("Alice", 25, "female"),
new Person("Bob", 30, "male"),
new Person("Charlie", 35, "male")
);
List<Animal> listB = Arrays.asList(
new Animal("Alice", 2, "cat"),
new Animal("Bob", 3, "dog"),
new Animal("David", 1, "cat")
);
List<Pair<Person, Animal>> result = match(listA, listB, a -> Arrays.asList(a.name, a.age), b -> Arrays.asList(b.ownerName, b.ownerAge));
for (Pair<Person, Animal> pair : result) {
System.out.println(pair.getLeft().name + " owns " + pair.getRight().name);
}
}
static class Person {
String name;
int age;
String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
static class Animal {
String name;
int age;
String ownerName;
public Animal(String name, int age, String ownerName) {
this.name = name;
this.age = age;
this.ownerName = ownerName;
}
}
static class Pair<L, R> {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() {
return left;
}
public R getRight() {
return right;
}
}
}
```
在这个实现中,我们使用了两个辅助方法toMap和Pair。toMap方法将列表转换为Map,并将多个字段作为key,这样我们就可以方便地查找匹配的元素。Pair是一个简单的元组类,用于保存匹配的元素对。
主要的方法是match。我们首先将两个列表转换为Map,然后遍历List A的每个元素,查找是否有与之匹配的元素在List B中。如果有,我们就将匹配的元素对保存到结果列表中。最后返回结果列表。
在这个示例中,我们使用了Person和Animal两个类来演示如何匹配多个字段。我们将Person的name和age字段作为key,将Animal的ownerName和ownerAge字段作为key。如果两个元素的key相同,它们就匹配。在这个例子中,我们输出每个人拥有的动物的名字。
这个实现可能并不完美,但它提供了一个基本的框架来处理这个问题。根据实际情况,你可能需要调整它来满足你的需求。
阅读全文