【发布时间】:2011-12-13 02:27:09
【问题描述】:
Java Method Class 和 Java 7 的 MethodHandle Class 都引用与方法关联的对象,但它们仍然很少使用,当需要将函数传递给另一个函数时,最好使用匿名类实现一个包含一个方法的接口。
(注意: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 可以应用一些句柄无法实现的优化。
【问题讨论】:
-
他们不是很慢吗?
-
我不得不说我还没有做任何基准测试。
-
方法很少使用,因为它们使用反射并且比直接方法调用慢得多。 MethodHandles 很少使用,因为它们直到最近才存在。 (Java7)
-
方法句柄不比本机调用或反射快。该 API 主要用于链接 invokedynamic 调用站点。
标签: java java-7 higher-order-functions