当list<B>和list<A>以多个字段进行匹配,且匹配到的件数比是N:M,将匹配成功的list<A>和list<B>出力。用java8写一段实现上述需求的共通方法
时间: 2024-05-14 13:15:04 浏览: 22
假设 A 和 B 类都有字段 a1 和 a2,用于匹配。
```
public static void match(List<A> listA, List<B> listB) {
Map<String, List<B>> bMap = listB.stream().collect(Collectors.groupingBy(b -> b.getA1() + b.getA2()));
for (A a : listA) {
List<B> matchList = bMap.get(a.getA1() + a.getA2());
if (matchList != null) {
System.out.println("Matched A: " + a);
System.out.println("Matched B: " + matchList);
}
}
}
```
首先将 listB 转换成 Map,以 a1 和 a2 的组合作为 key,每个 key 对应一个 B 对象的 List。然后遍历 listA,根据 a1 和 a2 的组合从 Map 中获取匹配的 B 对象的 List,如果不为 null,则输出匹配的 A 和 B 对象。
相关问题
当List<B>和list<A>以多个字段进行匹配,当key只在List<B>中存在时,向List<A>中追
加一个新的元素,可以采取以下两种方法:
方法一:使用Java 8的流操作,将List<A>和List<B>合并成一个Stream,并根据匹配条件进行过滤和映射,最终将结果收集到一个新的List<A>中。
示例代码如下:
```
List<A> newList = Stream.concat(listA.stream(), listB.stream())
.filter(b -> listA.stream().noneMatch(a -> a.getField1().equals(b.getField1()) && a.getField2().equals(b.getField2())))
.map(b -> new A(b.getField1(), b.getField2(), "", ""))
.collect(Collectors.toList());
```
上述代码首先使用Stream.concat()方法将List<A>和List<B>合并成一个Stream。接着使用filter()方法过滤出在List<A>中不存在的元素,然后使用map()方法将List<B>中的元素映射为List<A>中的元素,并将结果收集到一个新的List<A>中。
方法二:使用Java 8的方法引用和Lambda表达式,直接对List<A>进行迭代和修改。
示例代码如下:
```
listB.stream()
.filter(b -> listA.stream().noneMatch(a -> a.getField1().equals(b.getField1()) && a.getField2().equals(b.getField2())))
.forEach(b -> listA.add(new A(b.getField1(), b.getField2(), "", "")));
```
上述代码首先使用filter()方法过滤出在List<A>中不存在的元素,然后使用forEach()方法对List<B>进行迭代,并向List<A>中添加新的元素。由于List<A>是引用传递,因此修改后的结果将直接反映到原始的List<A>中。
当list<B>和list<A>以keyList进行匹配,且皮匹配到的件数比是N:M,将匹配成功的list<A>和list<B>出力。用java8写一段实现上述需求的共通方法
假设A和B都有一个名为key的属性,可以使用流操作和Lambda表达式实现上述需求:
```
public static <A, B> void matchListsByKey(List<A> listA, List<B> listB, Function<A, Object> keyA, Function<B, Object> keyB) {
Map<Object, List<A>> mapA = listA.stream().collect(Collectors.groupingBy(keyA));
Map<Object, List<B>> mapB = listB.stream().collect(Collectors.groupingBy(keyB));
for (Map.Entry<Object, List<A>> entryA : mapA.entrySet()) {
Object key = entryA.getKey();
List<A> listMatchedA = entryA.getValue();
List<B> listMatchedB = mapB.get(key);
if (listMatchedB != null) {
int sizeA = listMatchedA.size();
int sizeB = listMatchedB.size();
int sizeMatched = Math.min(sizeA, sizeB);
for (int i = 0; i < sizeMatched; i++) {
System.out.println(listMatchedA.get(i) + " matches " + listMatchedB.get(i));
}
}
}
}
```
这个方法接受两个列表和两个函数,分别用于从A和B对象中获取key属性的值。首先将两个列表分别按key属性分组,然后遍历A列表的每个key,获取匹配的A对象列表和B对象列表。如果B对象列表不为空,则取两个列表中对象数量较小的值作为匹配件数,然后输出匹配的A和B对象。注意这个方法没有返回值,只是输出匹配结果。可以根据具体情况自行修改。
相关推荐
![java](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![java](https://img-home.csdnimg.cn/images/20210720083646.png)