4 回答

TA貢獻(xiàn)1875條經(jīng)驗 獲得超3個贊
你可以這樣做:
Integer total = Optional.of(new Integer(10)).orElse(null);
如果該Optional
值可以為空,則:
Integer total = Optional.ofNullable(new Integer(10)).orElse(null);
Optional.ofNullable
在有值的情況下會防止NPEnull
。
在第一個示例中出現(xiàn)此錯誤的原因是,在 lambda 表達(dá)式中,不允許更改局部變量的引用。這就是為什么它們需要被宣布final
或?qū)嶋H上是最終的。
第二個示例之所以有效,是因為這里您沒有更改total
變量的引用。您只是使用其set()
方法更新其值。

TA貢獻(xiàn)1818條經(jīng)驗 獲得超8個贊
在這種情況下,您不僅觀察到兩個類之間的差異,而且觀察到使用它們的方式的差異。
b.ifPresent(b -> total =b);
這嘗試將一個新的Integer
引用(對不同對象的引用)分配給b
。Integer
或AtomicInteger
任何其他類型都不允許這樣做。
b.ifPresent(b -> total.set(b));
set
這會調(diào)用現(xiàn)有對象中的方法 ( ) AtomicInteger
。Integer
以及 AtomicInteger
所有其他類都允許從 lambda 內(nèi)部調(diào)用方法。不過,對于您的用例來說,一個重要的區(qū)別是,Integer
由于類是不可變的,因此沒有一種允許您更改值的方法。

TA貢獻(xiàn)1878條經(jīng)驗 獲得超4個贊
他們的行為有所不同,因為你正在做兩件完全不同的事情。
在你的第一個:
b.ifPresent(b -> total =b);
變量“total”代表您要更改其值的內(nèi)存區(qū)域。這是不允許的。
在第二 :
b.ifPresent(b -> total.set(b));
變量“total”表示內(nèi)存中引用(或指向)AtomicInteger 類實例的區(qū)域。您沒有更改該變量,而只是調(diào)用它的方法。由于“總計”本身沒有變化,所以這就是所謂的“有效最終”,因此是允許的。

TA貢獻(xiàn)1821條經(jīng)驗 獲得超6個贊
Integer
您詢問為什么和的行為AtomicInteger
在您的情況下有所不同。究其原因,確實無關(guān)AtomicInteger
。相反,區(qū)別在于它Integer
是不可變的,因此,更改對 an 的引用的值的唯一方法Integer
是通過賦值。但 lambda 表達(dá)式不允許對表達(dá)式范圍之外的局部變量進(jìn)行賦值。
有多種方法可以在不使用的情況下解決此問題AtomicInteger
:
創(chuàng)建您自己的
MutableInteger
,可以在 lambda 內(nèi)部設(shè)置使
Integer
對象變量而不是局部變量使用
orElse
或各種替代方法返回值而不是將其設(shè)置在內(nèi)部ifPresent
另請注意,您可能會考慮OptionalInt
而不是Optional<Integer>
.
添加回答
舉報