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 может применить некоторые оптимизации, которые невозможны с помощью дескрипторов.