3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
您應(yīng)該通過以下方式提供包裝好的消費(fèi)者forEach
:
.forEach(wrap(this::testLocale));
您正在做s -> wrap(testLocale(s))
的是提供一個(gè)仍然無法處理已檢查異常的新消費(fèi)者。
可能更容易理解的是forEach
接受Consumer
具有以下方法定義的 a:
void accept(T t); // does not define to throw the checked Exception
當(dāng)你這樣做的時(shí)候,你正在使用forEach(s -> ...)
的就是這個(gè)。Consumer::accept
另一方面,forEach(wrap(this::testLocale));
它將返回一個(gè)Consumer
靜止圖像,但是通過接受一個(gè)WrapConsumer<T> wrapper
確實(shí)聲明通過以下方式拋出的Exception
輸入作為輸入:
void accept(T t) throws Exception;

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
只是補(bǔ)充 Eugene 的回答,您期望方法 wrap() 將消費(fèi)者作為參數(shù),而不是返回 void 的調(diào)用方法。
您可以通過從 testLocale 方法中刪除 throws Exception 來證明這一點(diǎn)。
IDE 會(huì)給你錯(cuò)誤:
"reason: no instance(s) of type variable(s) T exist so that void conforms to WrapConsumer<T>"
您編寫的代碼(正確的消費(fèi)者)的類似代碼:
IntStream.range(1, locales.length) .mapToObj(i -> locales[i].toString()) .forEach(wrap(this::testLocale));
將會(huì):
IntStream.range(1, locales.length) .mapToObj(i -> locales[i].toString()) .forEach(wrap(l-> testLocale(l)));

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
您只是缺少正確的 lambda 語法。您當(dāng)前的代碼正在調(diào)用 wrap
一個(gè)void
參數(shù):-(wrap(testLocale(s))
具有testLocale(s)
void 返回類型)
您需要的正確 lambda 表達(dá)式是:
.forEach(wrap(s -> testLocale(s)));
wrap
返回一個(gè)函數(shù),因此您不需要延遲執(zhí)行它(即,不需要調(diào)用 的函數(shù)wrap
)。
添加回答
舉報(bào)