4 回答
TA贡献1875条经验 获得超3个赞
你可以这样做:
Integer total = Optional.of(new Integer(10)).orElse(null);
如果该Optional
值可以为空,则:
Integer total = Optional.ofNullable(new Integer(10)).orElse(null);
Optional.ofNullable
在有值的情况下会防止NPEnull
。
在第一个示例中出现此错误的原因是,在 lambda 表达式中,不允许更改局部变量的引用。这就是为什么它们需要被宣布final
或实际上是最终的。
第二个示例之所以有效,是因为这里您没有更改total
变量的引用。您只是使用其set()
方法更新其值。
TA贡献1818条经验 获得超8个赞
在这种情况下,您不仅观察到两个类之间的差异,而且观察到使用它们的方式的差异。
b.ifPresent(b -> total =b);
这尝试将一个新的Integer
引用(对不同对象的引用)分配给b
。Integer
或AtomicInteger
任何其他类型都不允许这样做。
b.ifPresent(b -> total.set(b));
set
这会调用现有对象中的方法 ( ) AtomicInteger
。Integer
以及 AtomicInteger
所有其他类都允许从 lambda 内部调用方法。不过,对于您的用例来说,一个重要的区别是,Integer
由于类是不可变的,因此没有一种允许您更改值的方法。
TA贡献1878条经验 获得超4个赞
他们的行为有所不同,因为你正在做两件完全不同的事情。
在你的第一个:
b.ifPresent(b -> total =b);
变量“total”代表您要更改其值的内存区域。这是不允许的。
在第二 :
b.ifPresent(b -> total.set(b));
变量“total”表示内存中引用(或指向)AtomicInteger 类实例的区域。您没有更改该变量,而只是调用它的方法。由于“总计”本身没有变化,所以这就是所谓的“有效最终”,因此是允许的。
TA贡献1821条经验 获得超6个赞
Integer
您询问为什么和的行为AtomicInteger
在您的情况下有所不同。究其原因,确实无关AtomicInteger
。相反,区别在于它Integer
是不可变的,因此,更改对 an 的引用的值的唯一方法Integer
是通过赋值。但 lambda 表达式不允许对表达式范围之外的局部变量进行赋值。
有多种方法可以在不使用的情况下解决此问题AtomicInteger
:
创建您自己的
MutableInteger
,可以在 lambda 内部设置使
Integer
对象变量而不是局部变量使用
orElse
或各种替代方法返回值而不是将其设置在内部ifPresent
另请注意,您可能会考虑OptionalInt
而不是Optional<Integer>
.
添加回答
举报