当List<B>和list<A>以多个字段进行匹配,当只在List<B>中存在时,向List<A>中追加对应的数据。用java8写一段实现上述需求的共通方法
时间: 2024-06-12 09:04:50 浏览: 99
ta-lib-0.5.1-cp312-cp312-win32.whl
假设A和B都有属性id和name,可以使用流操作和Lambda表达式实现上述需求:
```java
public static <A, B> void appendToList(List<A> listA, List<B> listB, Function<B, ?>... matchers) {
Set<List<Object>> matchSet = listB.stream()
.map(b -> Arrays.stream(matchers)
.map(matcher -> matcher.apply(b))
.collect(Collectors.toList()))
.collect(Collectors.toSet());
listA.addAll(listB.stream()
.filter(b -> matchSet.contains(Arrays.stream(matchers)
.map(matcher -> matcher.apply(b))
.collect(Collectors.toList())))
.map(b -> (A) b)
.collect(Collectors.toList()));
}
```
该方法接受两个参数,分别是要追加数据的目标List和源List,以及一个或多个Function类型的参数,用于指定匹配字段。具体实现如下:
1. 首先,使用流操作将List<B>中的元素映射为一个个List<Object>,其中每个List<Object>表示一个匹配字段的集合;
2. 然后,将这些List<Object>放入Set中去重;
3. 接着,使用流操作过滤出源List中那些匹配字段在Set中存在的元素,并将它们强制转换为目标类型,并添加到目标List中。
使用示例:
```java
List<A> listA = new ArrayList<>();
listA.add(new A(1, "foo"));
listA.add(new A(2, "bar"));
List<B> listB = new ArrayList<>();
listB.add(new B(1, "foo"));
listB.add(new B(3, "baz"));
appendToList(listA, listB, B::getId, B::getName);
System.out.println(listA); // [A{id=1, name='foo'}, A{id=2, name='bar'}, A{id=1, name='foo'}]
```
在上面的示例中,List<B>中的元素都有对应的id和name属性,因此我们使用B::getId和B::getName作为匹配字段。当List<B>中的元素与List<A>中的元素匹配时,将它们追加到List<A>中。最终,List<A>中包含了两个id为1的元素。
阅读全文