【发布时间】:2020-07-05 05:54:28
【问题描述】:
我正在查看以下代码(其他人的代码),部分代码对我来说似乎晦涩难懂:
List<string> result = forkJoinPool.invokeAll(tasks)
.stream()
.map(MUtil.rethrowFunction(Future::get))
.collect(toList());
这部分很简单,一个 ForkJoinPool.invokeAll() 返回一个 Future 对象列表,进一步处理返回一个字符串列表。
稍后,list.stream().map() 使用 Mutil 类 Mutil.rethrowFunction(Future::get) 上的静态方法并将其传递给 Future 类型的对象。查看 Mutil 源代码:
public class Mutil {
public static <T, R> Function<T, R> rethrowFunction(WithExceptionsIF<T, R> function) {
return t -> {
try { return function.apply(t); }
catch (Exception exception) { throwAsUnchecked(exception); return null; }
};
}
@FunctionalInterface
public interface WithExceptionsIF<T, R> {
R apply(T t) throws Exception;
}
@SuppressWarnings ("unchecked")
private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E { throw (E)exception; }
}
这是我的问题,因为我正在学习泛型、lambda 和 java.util.function 包:
-
Mutil.rethrowFunction()的签名表示它返回<T, R> Function<T, R>并使用WithExceptionsIF<T, R>类型的参数(这是一个功能接口)。 Future.get() 如何转换成Mutil.rethroFunction()签名? Future.get(),返回计算结果而不是函数? -
传递给
Mutil.rethrowFunction()的Future.get()如何转换为WithExceptionIF<T,R>类型? -
t->{return function.apply(t);}这句话是怎么回事?不是 Future 对象,如果是,那么“函数”是谁? -
Mutil.throwAsUnchecked(Exception exception)方法的签名在关键字“static”之后定义了<E extends Throwable>。如果“异常”是传递给方法的唯一参数,那么 E 来自哪里,为什么要在方法的返回类型(void)之前声明它?
感谢您的澄清。
【问题讨论】: