猿问

java中Integer、AtomicInteger的区别

当我使用 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));


拉莫斯之舞
浏览 166回答 4
4回答

翻过高山走不出你

你可以这样做:Integer&nbsp;total&nbsp;=&nbsp;Optional.of(new&nbsp;Integer(10)).orElse(null);如果该Optional值可以为空,则:Integer&nbsp;total&nbsp;=&nbsp;Optional.ofNullable(new&nbsp;Integer(10)).orElse(null);Optional.ofNullable在有值的情况下会防止NPEnull。在第一个示例中出现此错误的原因是,在 lambda 表达式中,不允许更改局部变量的引用。这就是为什么它们需要被宣布final或实际上是最终的。第二个示例之所以有效,是因为这里您没有更改total变量的引用。您只是使用其set()方法更新其值。

弑天下

在这种情况下,您不仅观察到两个类之间的差异,而且观察到使用它们的方式的差异。b.ifPresent(b&nbsp;->&nbsp;total&nbsp;=b);这尝试将一个新的Integer引用(对不同对象的引用)分配给b。Integer或AtomicInteger任何其他类型都不允许这样做。b.ifPresent(b&nbsp;->&nbsp;total.set(b));set这会调用现有对象中的方法 ( )&nbsp;AtomicInteger。Integer以及&nbsp;AtomicInteger所有其他类都允许从 lambda 内部调用方法。不过,对于您的用例来说,一个重要的区别是,Integer由于类是不可变的,因此没有一种允许您更改值的方法。

UYOU

他们的行为有所不同,因为你正在做两件完全不同的事情。在你的第一个:b.ifPresent(b&nbsp;->&nbsp;total&nbsp;=b);变量“total”代表您要更改其值的内存区域。这是不允许的。在第二 :b.ifPresent(b&nbsp;->&nbsp;total.set(b));变量“total”表示内存中引用(或指向)AtomicInteger 类实例的区域。您没有更改该变量,而只是调用它的方法。由于“总计”本身没有变化,所以这就是所谓的“有效最终”,因此是允许的。

达令说

Integer您询问为什么和的行为AtomicInteger在您的情况下有所不同。究其原因,确实无关AtomicInteger。相反,区别在于它Integer是不可变的,因此,更改对 an 的引用的值的唯一方法Integer是通过赋值。但 lambda 表达式不允许对表达式范围之外的局部变量进行赋值。有多种方法可以在不使用的情况下解决此问题AtomicInteger:创建您自己的MutableInteger,可以在 lambda 内部设置使Integer对象变量而不是局部变量使用orElse或各种替代方法返回值而不是将其设置在内部ifPresent另请注意,您可能会考虑OptionalInt而不是Optional<Integer>.
随时随地看视频慕课网APP

相关分类

Java
我要回答