Java通过对象ID比对两个列表及lambda有效最终变量报错处理
报错解决方案
你遇到的报错是Java的基础语法限制:lambda表达式中引用的外部局部变量,必须是被final显式修饰,或者是有效final(变量首次赋值后没有再被重新赋值)。
你可以先检查代码里castings变量定义后有没有castings = 新的列表对象这类重新赋值的操作,再从两个方案里选一个适配你的业务:
- 方案1:如果
castings后续还有修改逻辑,新增一个临时final变量承接它的值再放到lambda中使用:
final List<Casting> finalCastings = castings; List<Casting> unMatchList = maxCastings.stream() .filter(o1 -> finalCastings.stream().noneMatch(o2 -> o2.getCharacterNo().equals(o1.getCharacterNo()))) .collect(Collectors.toList());
- 方案2:如果
castings后续不需要重新赋值,直接给原变量加final修饰即可。
更高效的列表比对方案
你当前写的双层Stream遍历属于嵌套循环逻辑,时间复杂度为O(n*m),两个列表长度越大性能损耗越明显。更优的实现方式是先把castings的所有characterNo提取到HashSet中,利用HashSet O(1)的查找效率把整体时间复杂度降到O(n+m),代码如下:
// 先提取castings的所有characterNo存入Set Set<String> castingNoSet = castings.stream() .map(Casting::getCharacterNo) .collect(Collectors.toSet()); // 直接遍历maxCastings过滤即可 List<Casting> unMatchList = maxCastings.stream() .filter(o -> !castingNoSet.contains(o.getCharacterNo())) .collect(Collectors.toList());
按你提供的示例数据,最终unMatchList会得到characterNo为100128和100130的两条记录,完全符合预期。
内容的提问来源于stack exchange,提问作者horoyoi o
相关产品推荐
相关产品推荐

