Java方法类和 Java 7 的MethodHandle类都指与方法相关联的对象,但它们仍然很少使用,当需要将函数传递给另一个函数时,最好使用实现包含一个接口的匿名类方法。
(注意:MethodHandles 应该比旧的方法更快。)
为什么不经常使用这些构造来将函数传递给函数?是因为它们仍然很冗长吗?
代码示例:
public final class HigherOrder {
public static final List<?> map(final List<?> list, final MethodHandle mh) throws Throwable {
if (list == null) return null;
List<Object> ret = new ArrayList<>(list.size());
for (Object element : list) {
ret.add(mh.invoke(element));
}
return ret;
}
public static final Object reduce(final List<?> list, final MethodHandle mh) throws Throwable {
if (list == null) return null;
Object tmp = list.get(0);
for (int i = 1; i < list.size(); i++) {
tmp = mh.invoke(tmp, list.get(i));
}
return tmp;
}
public static final Integer doubleNumber(final Integer number) {
return number * 2;
}
public static final Integer sum(final Integer number1, final Integer number2) {
return number1 + number2;
}
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle doubleNumber = lookup.unreflect(HigherOrder.class.getMethod("doubleNumber", Integer.class));
MethodHandle sum = lookup.findStatic(HigherOrder.class, "sum", MethodType.methodType(Integer.class, Integer.class, Integer.class));
List<?> list = Arrays.asList(1, 2, 3, 4, 5);
System.out.println(list);
list = map(list, doubleNumber);
System.out.println(list);
System.out.println(reduce(list, sum));
}
}
更新
在进行了一些基准测试后,我注意到 MethodHandle 比 Reflection 的方法快,但仍远不及常规方法调用。也许对于方法调用,JVM 可以应用一些句柄无法实现的优化。