当list<B>中由多个字段组成的keyList的值在list<A>中能找到一致的数据时,将匹配到的list<A>和list<B>出力出来。用java8写一段实现上述需求的共通方法
时间: 2024-05-12 16:21:16 浏览: 135
将list<bean>中的内容根据某一属性的值对list进行拆分
假设list A和list B都有一个字段叫做"key"。
```
public static <T, U> List<Pair<T, U>> findMatches(List<T> listA, List<U> listB, Function<T, Object> keyExtractorA, Function<U, Object> keyExtractorB) {
Map<Object, List<T>> mapA = listA.stream().collect(Collectors.groupingBy(keyExtractorA));
Map<Object, List<U>> mapB = listB.stream().collect(Collectors.groupingBy(keyExtractorB));
List<Pair<T, U>> matches = new ArrayList<>();
for (Map.Entry<Object, List<T>> entryA : mapA.entrySet()) {
Object key = entryA.getKey();
List<T> valuesA = entryA.getValue();
List<U> valuesB = mapB.get(key);
if (valuesB != null) {
for (T valueA : valuesA) {
for (U valueB : valuesB) {
matches.add(new Pair<>(valueA, valueB));
}
}
}
}
return matches;
}
```
这个方法接受两个列表和两个函数,分别用于从列表中的对象中提取key值。它将列表A和列表B分别按照key值分组,然后对于每个key值,将列表A和列表B中的匹配项加入到结果中。
使用的时候可以这样调用:
```
List<A> listA = ...
List<B> listB = ...
List<Pair<A, B>> matches = findMatches(listA, listB, A::getKey, B::getKey);
```
阅读全文