将List<B>与List<A>进行match,当List<B>中存在List<A>中没有的数据时,向List<A>中根据条件追加。用java8写一个共通方法
时间: 2024-05-14 15:15:01 浏览: 139
C#重要知识之——泛型列表List<T>例子
5星 · 资源好评率100%
假设A和B类的定义如下:
```java
public class A {
private int id;
private String name;
// getter/setter 省略
}
public class B {
private int id;
private String name;
private String description;
// getter/setter 省略
}
```
共通方法的实现如下:
```java
public static <T extends A, U extends B> void matchAndAppend(List<T> listA, List<U> listB, BiPredicate<T, U> predicate, Function<U, T> mapper) {
Set<Integer> idSetA = listA.stream().map(A::getId).collect(Collectors.toSet());
listB.stream()
.filter(b -> !idSetA.contains(b.getId()))
.map(mapper)
.filter(a -> listB.stream().anyMatch(b -> predicate.test(a, b)))
.forEach(listA::add);
}
```
方法的参数说明:
- `listA`:待追加数据的列表;
- `listB`:原始数据的列表;
- `predicate`:用于匹配A和B对象是否匹配的谓词;
- `mapper`:将B对象转换为A对象的映射函数。
方法的实现步骤如下:
- 首先,将A列表中所有元素的id提取出来,放入一个Set中,以便后面判断B对象是否存在于A列表;
- 然后,过滤出B列表中不存在于A列表中的元素,并将其转换为A对象;
- 接着,对转换后的A对象进行过滤,只留下符合条件的对象,即存在于B列表中;
- 最后,将符合条件的A对象添加到A列表中。
示例代码如下:
```java
List<A> listA = new ArrayList<>();
List<B> listB = new ArrayList<>();
listB.add(new B(1, "A", "B"));
listB.add(new B(2, "B", "C"));
listB.add(new B(3, "C", "D"));
matchAndAppend(listA, listB, (a, b) -> Objects.equals(a.getName(), b.getName()), b -> new A(b.getId(), b.getName()));
System.out.println(listA); // 输出:[A{id=1, name='A'}, A{id=2, name='B'}, A{id=3, name='C'}]
```
在上面的示例代码中,我们将B转换为A时,只保留了id和name两个属性,其它属性被丢弃了。如果需要保留其它属性,可以在A类中添加对应的属性,并在mapper函数中进行转换。
阅读全文