当List<B>以2个字段作为keyList与List<A>进行match,将match成功的数据按照传进来的条件将部分字段更新后生成新的list,并且要求不改变原来List<B>的值。用Java8写一个满足需求的共通方法
时间: 2024-06-12 22:05:56 浏览: 121
假设List<B>中有两个字段为field1和field2,List<A>中有与之对应的字段field1和field2,需要更新的字段为field3和field4。
可以使用Java8的Stream API和Lambda表达式实现该功能,代码如下:
```java
public static List<B> matchAndTransform(List<B> listB, List<A> listA, Function<B, B> transformer) {
Map<String, Map<String, List<B>>> mapB = listB.stream()
.collect(Collectors.groupingBy(B::getField1, Collectors.groupingBy(B::getField2)));
Map<String, Map<String, List<A>>> mapA = listA.stream()
.collect(Collectors.groupingBy(A::getField1, Collectors.groupingBy(A::getField2)));
List<B> result = new ArrayList<>();
mapB.forEach((key1, value1) -> {
Map<String, List<A>> value2 = mapA.get(key1);
if (value2 != null) {
value1.forEach((key2, value3) -> {
List<A> value4 = value2.get(key2);
if (value4 != null) {
value3.stream()
.map(transformer)
.forEach(result::add);
} else {
result.addAll(value3);
}
});
} else {
value1.forEach((key2, value3) -> result.addAll(value3));
}
});
return result;
}
```
该方法的参数列表包括:
- List<B> listB:需要进行匹配和转换的List<B>
- List<A> listA:与List<B>匹配的List<A>
- Function<B, B> transformer:用于将匹配成功的B转换为新的B的函数
该方法的实现过程如下:
1. 首先将List<B>按照field1和field2进行分组,生成一个Map<String, Map<String, List<B>>>,其中第一层Map的key为field1,第二层Map的key为field2,对应的value为符合条件的B的List。
2. 将List<A>按照field1和field2进行分组,生成一个Map<String, Map<String, List<A>>>,与第一步类似。
3. 遍历第一步生成的Map,对于每个符合条件的B的List,查找在第二步生成的Map中是否存在对应的List<A>,如果存在,则将符合条件的B转换为新的B并添加到结果List中;如果不存在,则直接将原来的B添加到结果List中。
4. 将结果List返回。
在使用该方法时,需要传入一个lambda表达式作为transformer参数,该lambda表达式实现将匹配成功的B转换为新的B的逻辑。例如,如果需要将field3的值设置为10,field4的值设置为20,可以使用如下的lambda表达式:
```java
B::setField3AndField4
```
其中B::setField3AndField4是一个自定义的方法,实现如下:
```java
public B setField3AndField4() {
this.field3 = 10;
this.field4 = 20;
return this;
}
```
上述方法使用了Java8的Stream API和Lambda表达式,可以更加简洁和易读地实现该功能。
阅读全文