解决lambda中必须为final的方式

简介: 解决lambda中必须为final的方式

一个真正而且热切地工作的人总是有希望的——只有怠惰才是永恒的绝望。——卡莱尔

在开发中使用lambda经常出现一个问题

编译提示我们lambda中使用的变量必须为final或者effectively final

int i = 2;
BigDecimal j = BigDecimal.ZERO;
j = BigDecimal.TEN;
List<String> stringList = mpUserMapper.selectList(Wrappers.lambdaQuery()).stream().map(UserDataObject::getUsername).collect(Collectors.toList());
stringList = stringList.stream().distinct().collect(Collectors.toList());
List<String> strings = new ArrayList<>(10);
strings.stream().peek(s -> {
    stringList.add(s);
    i = 3;
    j.add(BigDecimal.ONE);
}).collect(Collectors.toList());

如何处理,我想大家一般都是直接点转换为自动

int转换为AtomicIntegerlist赋值给为finalList

之后就是这样子

AtomicInteger i = new AtomicInteger(2);
BigDecimal j = BigDecimal.ZERO;
j = BigDecimal.TEN;
List<String> stringList = mpUserMapper.selectList(Wrappers.lambdaQuery()).stream().map(UserDataObject::getUsername).collect(Collectors.toList());
stringList = stringList.stream().distinct().collect(Collectors.toList());
List<String> strings = new ArrayList<>(10);
List<String> finalStringList = stringList;
BigDecimal finalJ = j;
strings.stream().peek(s -> {
    finalStringList.add(s);
    i.set(3);
    finalJ.add(BigDecimal.ONE);
}).collect(Collectors.toList());

虽然上面的integeridea帮我们转换成了atomic原子类,但下面的stringList和变量j都赋值给了一个临时变量【final+变量名】

编译报错是解决了,但代码的可读性降低了

那么有没有更优雅的解决方案呢?其实是有的

我们这里出现变量必须为final或者effectively final的提示,造成的原因是因为我们对变量进行了二次赋值

我们这里可以像AtomicInteger一样使用原子类AtomicReference

再观察stringList,我们当然可以接连下面的去重操作,把两行变为一行去解决

但如果场景发生变化,我们要执行一些判断或者其他逻辑,再进行赋值

对于这种场景,使用两行变一行的方式就不好用了

我们就可以使用Lists.addAll代替我们的赋值操作

这种方式比一开始的使用一个临时变量赋值的方式感觉要好多了

特别是大量用到stream的时候,如果是一堆用于lambda的临时变量,很可能会犯晕

相关文章
|
1月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
39 0
|
7月前
|
存储 Cloud Native Linux
C++ 关键字override,final的作用
C++ 关键字override,final的作用
|
15天前
|
Java 容器
2分钟学习ThreadLocal的Lambda构造方式
2分钟学习ThreadLocal的Lambda构造方式
8 0
|
8月前
|
存储 Java 编译器
【Java异常】Variable used in lambda expression should be final or effectively final
【Java异常】Variable used in lambda expression should be final or effectively final
106 0
【Java异常】Variable used in lambda expression should be final or effectively final
|
1月前
static的另一用法
static的另一用法。
20 0
|
1月前
|
存储 编译器 C++
掌握 C++ 中 static 关键字的多种使用场景
在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种:
67 0
|
9月前
|
Java
final 类,常量,方法的解释
final 类,常量,方法的解释
67 1
|
编译器 C++
【C++11】final与override关键字和类的新功能
#「持之以恒」挑战赛-30天技术创作养成记!# 目录 一、final与override关键字 1.1 final 1.2 override 二、类的新功能 2.1 默认成员函数 2.2 类成员变量初始化 2.3 default关键字 2.4 delete关键字
83 0
【C++11】final与override关键字和类的新功能
|
Java 编译器
规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
165 0