2 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
在您的第一個(gè)代碼示例中,您將 lambda 表達(dá)式分配() -> msg
給tasks
數(shù)組的每個(gè)元素。
但是,在第二個(gè)示例中,您將 lambda 表達(dá)式分配() -> msg
給類型為 的臨時(shí)變量。的目的是將流的元素傳遞給以某種方式使用這些元素的消費(fèi)者。如果您以某種方式分配給消費(fèi)者的參數(shù),流的來(lái)源將不會(huì)反映這一點(diǎn)。這樣的操作甚至可能沒(méi)有任何意義:t
Callable<String>
Stream#forEach
IntStream.range(1,10).filter((x) -> (x % 2 == 0)).forEach((x) -> {++x;});
這與 Java 流的一般主題相關(guān):它們是用于生成、轉(zhuǎn)換、過(guò)濾和使用數(shù)據(jù)的單向管道。當(dāng)數(shù)據(jù)從Arrays.stream
供應(yīng)商流出時(shí),它只能沿一個(gè)方向流入消費(fèi)者 ( forEach
);下游所做的更改不會(huì)傳播回上游。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
您的流代碼等效于以下for
循環(huán):
for (Callable<String> t : tasks) { t = () -> message; }
它本身相當(dāng)于:
for (int i = 0; i < tasks.length; i++) { Callable<String> t = tasks[i]; t = () -> msg; }
改變 的值t
不會(huì)改變 的值tasks[i]
。
要?jiǎng)?chuàng)建長(zhǎng)度messageCount
為 lambda 表達(dá)式的數(shù)組,請(qǐng)使用流:
Callable<String>[] tasks = IntStream.range(0, messageCount) .mapToObj(i -> (Callable<String>) () -> msg) .toArray(Callable[]::new);
添加回答
舉報(bào)