3 回答
TA贡献1827条经验 获得超8个赞
您应该通过以下方式提供包装好的消费者forEach:
.forEach(wrap(this::testLocale));
您正在做s -> wrap(testLocale(s))的是提供一个仍然无法处理已检查异常的新消费者。
可能更容易理解的是forEach接受Consumer具有以下方法定义的 a:
void accept(T t); // does not define to throw the checked Exception
当你这样做的时候,你正在使用forEach(s -> ...)的就是这个。Consumer::accept
另一方面,forEach(wrap(this::testLocale));它将返回一个Consumer静止图像,但是通过接受一个WrapConsumer<T> wrapper确实声明通过以下方式抛出的Exception输入作为输入:
void accept(T t) throws Exception;
TA贡献1848条经验 获得超6个赞
只是补充 Eugene 的回答,您期望方法 wrap() 将消费者作为参数,而不是返回 void 的调用方法。
您可以通过从 testLocale 方法中删除 throws Exception 来证明这一点。
IDE 会给你错误:
"reason: no instance(s) of type variable(s) T exist so that void conforms to WrapConsumer<T>"
您编写的代码(正确的消费者)的类似代码:
IntStream.range(1, locales.length) .mapToObj(i -> locales[i].toString()) .forEach(wrap(this::testLocale));
将会:
IntStream.range(1, locales.length) .mapToObj(i -> locales[i].toString()) .forEach(wrap(l-> testLocale(l)));
TA贡献1811条经验 获得超5个赞
您只是缺少正确的 lambda 语法。您当前的代码正在调用 wrap一个void参数:-(wrap(testLocale(s))具有testLocale(s)void 返回类型)
您需要的正确 lambda 表达式是:
.forEach(wrap(s -> testLocale(s)));
wrap返回一个函数,因此您不需要延迟执行它(即,不需要调用 的函数wrap)。
添加回答
举报
