簡體   English   中英

是否有原始值的 object 包裝器允許從 lambda 改變它們?

[英]Is there an object wrapper for primitive values that allows mutating them from a lambda?

考慮:

boolean somethingHappened = false;
Runnable doHappen = () -> { somethingHappened = true; }

你不能那樣做,因為somethingHappened不是最終的。 理由是,通常,您不需要更改從 lambda 到 scope 捕獲的變量。但是例如,當使用Stream.forEach時,這不是一個不尋常的需要。

我當然可以寫一個包裝器:

class Wrap<T> 
{
    public T value;
}

然后我會訪問somethingHappened.value並更改它。

我只是想知道標准 Java 庫中是否已經存在這種包裝器。 我只知道Optional是不可變的。 我可以濫用數組final boolean[] mutableBool = { false }但這太可怕了。

不在 Java 庫中。 但是 Apache Commons Lang 對此有Mutable 它為每個原始包裝器提供子類,但每個包裝器都是可變的(如 MutableInt、MutableBoolean 等)

您可以考慮使用它是否對您可行。


更新

AtomicBoolean 是另一種選擇。 它允許您在線程之間共享它並更新它持有的 boolean 值。


我的 0.02 美元——每當我必須從 lambda 更新一個變量時,我都會退后一步,重新考慮我是否真的應該這樣做,以及使用 lambda 是否適合這種情況。 到目前為止(AFAIR),我從來沒有訴諸任何方法來克服 lambda 中使用的變量必須有效最終的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM