为了账号安全,请及时绑定邮箱和手机立即绑定

java中Integer、AtomicInteger的区别

java中Integer、AtomicInteger的区别

拉莫斯之舞 2024-01-05 16:17:52
当我使用 java 的可选类时,如下所示Integer total = null;Optional<Integer> b = Optional.of(new Integer(10));b.ifPresent(b -> total =b);上面的代码不起作用(错误:java:从 lambda 表达式引用的局部变量必须是最终的或有效的最终),但是,当我使用 AtomicInteger 时,它将起作用。为什么会出现这种情况?Optional<Integer> b = Optional.of(new Integer(10));AtomicInteger total = new AtomicInteger();b.ifPresent(b -> total.set(b));
查看完整描述

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()方法更新其值。


查看完整回答
反对 回复 2024-01-05
?
弑天下

TA贡献1818条经验 获得超7个赞

在这种情况下,您不仅观察到两个类之间的差异,而且观察到使用它们的方式的差异。

b.ifPresent(b -> total =b);

这尝试将一个新的Integer引用(对不同对象的引用)分配给bIntegerAtomicInteger任何其他类型都不允许这样做。

b.ifPresent(b -> total.set(b));

set这会调用现有对象中的方法 ( ) AtomicIntegerInteger以及 AtomicInteger所有其他类都允许从 lambda 内部调用方法。不过,对于您的用例来说,一个重要的区别是,Integer由于类是不可变的,因此没有一种允许您更改值的方法。


查看完整回答
反对 回复 2024-01-05
?
UYOU

TA贡献1878条经验 获得超4个赞

他们的行为有所不同,因为你正在做两件完全不同的事情。

在你的第一个:

b.ifPresent(b -> total =b);

变量“total”代表您要更改其值的内存区域。这是不允许的。

在第二 :

b.ifPresent(b -> total.set(b));

变量“total”表示内存中引用(或指向)AtomicInteger 类实例的区域。您没有更改该变量,而只是调用它的方法。由于“总计”本身没有变化,所以这就是所谓的“有效最终”,因此是允许的。


查看完整回答
反对 回复 2024-01-05
?
达令说

TA贡献1821条经验 获得超6个赞

Integer您询问为什么和的行为AtomicInteger在您的情况下有所不同。究其原因,确实无关AtomicInteger。相反,区别在于它Integer是不可变的,因此,更改对 an 的引用的值的唯一方法Integer是通过赋值。但 lambda 表达式不允许对表达式范围之外的局部变量进行赋值。

有多种方法可以在不使用的情况下解决此问题AtomicInteger

  1. 创建您自己的MutableInteger,可以在 lambda 内部设置

  2. 使Integer对象变量而不是局部变量

  3. 使用orElse或各种替代方法返回值而不是将其设置在内部ifPresent

另请注意,您可能会考虑OptionalInt而不是Optional<Integer>.


查看完整回答
反对 回复 2024-01-05
  • 4 回答
  • 0 关注
  • 58 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信