当List<A>和List<B>以组合key进行match,将match成功的List<A>和List<B>分别出力。用java8写一个共通方法
时间: 2024-05-02 22:20:58 浏览: 95
java8实现list集合中按照某一个值相加求和,平均值等操作代码
可以使用Java 8的Stream API来实现这个共通方法。具体实现如下:
```java
public static <A, B, K> void matchListsByKeys(List<A> listA, List<B> listB, Function<A, K> keyExtractorA, Function<B, K> keyExtractorB, BiConsumer<List<A>, List<B>> matchConsumer) {
Map<K, List<A>> mapA = listA.stream().collect(Collectors.groupingBy(keyExtractorA));
Map<K, List<B>> mapB = listB.stream().collect(Collectors.groupingBy(keyExtractorB));
for (K key : mapA.keySet()) {
if (mapB.containsKey(key)) {
matchConsumer.accept(mapA.get(key), mapB.get(key));
}
}
}
```
这个方法有四个参数:
1. `listA`:第一个列表
2. `listB`:第二个列表
3. `keyExtractorA`:从第一个列表中的元素提取组合key的函数
4. `keyExtractorB`:从第二个列表中的元素提取组合key的函数
另外,还有一个`matchConsumer`参数,它是一个函数接口,用于接收成功匹配的`List<A>`和`List<B>`并进行处理。
这个方法的实现分为以下几步:
1. 使用`groupingBy`方法将第一个列表中的元素按照组合key分组,得到一个`Map<K, List<A>>`
2. 使用`groupingBy`方法将第二个列表中的元素按照组合key分组,得到一个`Map<K, List<B>>`
3. 遍历第一个`Map<K, List<A>>`,对于每个key,如果第二个`Map<K, List<B>>`中也包含该key,则调用`matchConsumer`函数接收对应的`List<A>`和`List<B>`
4. 完成匹配
使用这个方法的示例代码如下:
```java
List<Person> persons = Arrays.asList(
new Person("Alice", 20),
new Person("Bob", 25),
new Person("Charlie", 30),
new Person("Dave", 35)
);
List<Job> jobs = Arrays.asList(
new Job("Teacher", 20000),
new Job("Engineer", 30000),
new Job("Doctor", 40000),
new Job("Lawyer", 50000)
);
matchListsByKeys(persons, jobs, Person::getAge, Job::getSalary, (matchedPersons, matchedJobs) -> {
System.out.println("Matched persons: " + matchedPersons);
System.out.println("Matched jobs: " + matchedJobs);
});
```
这个示例代码将`persons`和`jobs`按照年龄和薪水进行match,并将匹配成功的`Person`和`Job`分别输出。其中,`Person`和`Job`类的定义如下:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + "(" + age + ")";
}
}
public class Job {
private String title;
private int salary;
public Job(String title, int salary) {
this.title = title;
this.salary = salary;
}
public String getTitle() {
return title;
}
public int getSalary() {
return salary;
}
@Override
public String toString() {
return title + "(" + salary + ")";
}
}
```
阅读全文