我有以下代碼Java的隊列評估順序
myQueue.offer(new myObj(
fcnA,
Collections2.transform(...),
Collections2.transform(...)
))
我的問題是在什麼時候被Collections2.transform(...)
評估?
我的猜測是,直到從隊列中調用myObj的創建纔會發生這種情況。它是否正確?
我有以下代碼Java的隊列評估順序
myQueue.offer(new myObj(
fcnA,
Collections2.transform(...),
Collections2.transform(...)
))
我的問題是在什麼時候被Collections2.transform(...)
評估?
我的猜測是,直到從隊列中調用myObj的創建纔會發生這種情況。它是否正確?
總之,是的,它會在構造函數被調用時被評估。
請參閱Java語言規範(JLS),15.12.4.2. Evaluate Arguments,特別是最後2段和Example 15.12.4.1-2. Evaluation Order During Method Invocation。
這是真的,但可能非常不相關,因爲'Collections2.transform'沒有任何功能。它只創建一個'TransformedCollection',它是* lazy *。所以你完全回答了OP的要求,但可能錯過了他們需要知道的內容。 – maaartinus 2014-09-29 18:48:42
@maaartinus,你可以自由投票給我,完全回答問題,而不是假設告訴他我認爲他需要知道什麼。 – Paul 2014-09-29 19:29:49
沒有理由downvote。我只想讓每個人都看着你的答案,看看還有更多需要考慮的事情。 – maaartinus 2014-09-29 19:40:20
Collections2
看起來像一個番石榴類。如果是這樣,那麼transform()
會返回一個惰性集合,即實時視圖到源集合中。當你通過Collection
接口實際訪問colections的元素時(可能是在迭代集合時),將評估所有操作。
如果您需要有一個集合的轉換副本,您需要自己複製副本(例如new ArrayList(Collections2.transform(...))
)。
我們沒有足夠的上下文來說實話 - 除了其他任何東西之外,它取決於你的意思是「什麼時候對Collections2.transform(...)進行評估」 - 如果你在這個轉換中已經有了動作,很可能是執行了'transform',但它會返回一個值,稍後將執行單個動作。 – 2014-09-29 16:09:21