当list<B>中由多个字段组成的keyList的值在list<A>中能找到一致的数据时,将这些数据根据更新条件将对应的字段值做更新后输出到新的list<B>中,并不改变原来的list<B>的值。用java8写一段实现上述需求的共通方法
时间: 2024-05-10 10:20:36 浏览: 120
List<map>多字段组合排序
5星 · 资源好评率100%
假设list<A>和list<B>的元素类型分别为A和B,keyList是由多个字段组成的key列表,需要根据这些字段匹配A和B,更新B的对应字段值。
可以使用Java 8的Stream API对list<A>进行过滤和映射,然后使用Collectors.toMap()将匹配的A对象转换为Map,最后使用Stream API对list<B>进行更新和收集。
具体实现代码如下:
```
public static <A, B> List<B> updateList(List<A> listA, List<B> listB, List<String> keyList, BiConsumer<A, B> updateFunc) {
// 将listA转换为Map,key为keyList对应字段的值,value为A对象
Map<Object, A> mapA = listA.stream()
.collect(Collectors.toMap(
a -> keyList.stream()
.map(key -> {
try {
Field field = a.getClass().getDeclaredField(key);
field.setAccessible(true);
return field.get(a);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList()),
a -> a
));
// 对listB进行更新和收集
return listB.stream()
.map(b -> {
Object[] keyValues = keyList.stream()
.map(key -> {
try {
Field field = b.getClass().getDeclaredField(key);
field.setAccessible(true);
return field.get(b);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.toArray();
A a = mapA.get(keyValues);
if (a != null) {
updateFunc.accept(a, b);
}
return b;
})
.collect(Collectors.toList());
}
```
其中,updateList()方法接受三个参数:listA表示待匹配的列表,listB表示待更新的列表,keyList表示用于匹配的字段列表,updateFunc表示更新函数,用于将匹配的A对象的字段值更新到对应的B对象中。
使用示例:
假设有如下的类定义:
```
class A {
String field1;
int field2;
...
}
class B {
String field1;
int field2;
double field3;
...
}
```
要根据field1和field2字段匹配A和B,并将A的field2的值更新到B的field3中,可以这样调用updateList()方法:
```
List<A> listA = ...
List<B> listB = ...
List<String> keyList = Arrays.asList("field1", "field2");
List<B> updatedListB = updateList(listA, listB, keyList, (a, b) -> b.setField3(a.getField2()));
```
注意,updateFunc参数的类型为BiConsumer,表示接受两个参数的函数,分别为A和B对象,可以根据具体的更新需求来编写对应的lambda表达式。在示例中,我们使用了B类的setField3()方法来更新field3字段的值。
阅读全文