当List<B>以2个字段作为keyList与List<A>进行match,将match成功的数据按照传进来的条件将部分字段更新后生成新的list,并且要求不改变原来List<B>的值。用Java8写一个满足需求的共通方法
时间: 2024-05-03 13:23:07 浏览: 152
假设List<B>中的key由两个字段a和b组成,List<A>中的key由两个字段c和d组成,更新的字段为e和f,则可以实现如下方法:
```
public static List<B> updateList(List<B> bList, List<A> aList, BiFunction<B, A, Boolean> matchFunc, Function<B, B> updateFunc) {
// 先创建一个新的List存放更新后的数据
List<B> updatedBList = new ArrayList<>(bList.size());
updatedBList.addAll(bList);
// 遍历List<B>和List<A>进行匹配,找到匹配的数据进行更新
for (B b : bList) {
for (A a : aList) {
if (matchFunc.apply(b, a)) {
// 匹配成功,复制一份B对象进行更新,保证不改变原来List<B>的值
B updatedB = new B(b);
updatedB.setE(a.getC() + a.getD()); // 根据条件更新字段
updatedB.setF(a.getC() - a.getD());
updatedBList.set(bList.indexOf(b), updateFunc.apply(updatedB));
}
}
}
return updatedBList;
}
```
其中,matchFunc是一个BiFunction,用于判断List<B>中的一个元素是否与List<A>中的一个元素匹配。如果匹配成功,就会调用updateFunc对匹配成功的元素进行更新,并将更新后的元素添加到新的List中。
使用时,可以定义一个matchFunc和一个updateFunc,然后传入方法中即可:
```
List<B> bList = ...; // 原始的List<B>
List<A> aList = ...; // List<A>中的数据用于匹配和更新
BiFunction<B, A, Boolean> matchFunc = (b, a) -> b.getA().equals(a.getC()) && b.getB().equals(a.getD());
Function<B, B> updateFunc = b -> b; // 不进行任何更新,只是为了演示用法
List<B> updatedBList = updateList(bList, aList, matchFunc, updateFunc);
```
以上代码演示了如何使用Java 8的函数式编程特性实现题目要求的方法。在这个方法中,我们使用了Lambda表达式、函数式接口、方法引用等特性,使代码更加简洁、可读、易于维护。
阅读全文