Можно ли считать Java MethodHandles тем же, что и функции первого класса?

Java Method Class и MethodHandle Class в Java 7 оба относятся к объектам, связанным с методами, но все же они редко используются, и когда функцию нужно передать другому, предпочтительнее использовать анонимный класс, реализующий интерфейс, который содержит один метод.

(Примечание: MethodHandles должны быть быстрее, чем старые Methods.)

Почему эти конструкции не используются чаще для передачи функций функциям? Это потому, что они все еще многословны?

Пример кода:

public final class HigherOrder {

public static final List map(final List list, final MethodHandle mh) throws Throwable {
    if (list == null) return null;
    List 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));
}
}

UPDATE

После проведения некоторого бенчмаркинга я заметил, что MethodHandle быстрее, чем метод Reflection, но все еще не так быстро, как обычный вызов метода. Возможно, для вызова метода JVM может применить некоторые оптимизации, которые невозможны для хэндлов.

9
задан Luciano 13 December 2011 в 13:56
поделиться