Как я могу записать анонимную функцию в Java?

Это даже возможно?

85
задан aarona 3 May 2010 в 10:21
поделиться

3 ответа

, если вы имеете в виду анонимную функцию, и используют версию Java до Java 8, то одним словом, нет. ( Прочтите о лямбда-выражениях, если вы используете Java 8+ )

Однако вы можете реализовать интерфейс с такой функцией:

Comparator<String> c = new Comparator<String>() {
    int compare(String s, String s2) { ... }
};

и вы можете использовать это с внутренними классами, чтобы получить почти- анонимная функция :)

77
ответ дан 24 November 2019 в 08:20
поделиться

Вот пример анонимного внутреннего класса.

System.out.println(new Object() {
    @Override public String toString() {
        return "Hello world!";
    }
}); // prints "Hello world!"

Это не очень полезно, но показывает, как создать экземпляр анонимного внутреннего класса, который расширяет Object и @Override его toString() метод.

См. также


Анонимные внутренние классы очень удобны, когда вам нужно реализовать интерфейс, который может оказаться малопригодным для повторного использования (и поэтому его не стоит рефакторить в собственный именованный класс). Поучительным примером является использование пользовательского java.util.Comparator для сортировки.

Вот пример того, как можно отсортировать String[] на основе String.length().

import java.util.*;
//...

String[] arr = { "xxx", "cd", "ab", "z" };
Arrays.sort(arr, new Comparator<String>() {
    @Override public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }           
});
System.out.println(Arrays.toString(arr));
// prints "[z, cd, ab, xxx]"

Обратите внимание на использованный здесь прием сравнения по вычитанию. Следует сказать, что эта техника в целом не работает: она применима только тогда, когда вы можете гарантировать, что она не переполнится (как в случае с длиной String).

См. также

44
ответ дан 24 November 2019 в 08:20
поделиться

Анонимные внутренние классы, реализующие или расширяющие интерфейс существующего типа, были выполнены в других ответах, хотя стоит отметить, что могут быть реализованы несколько методов (часто с событиями в стиле JavaBean, например).

Немного узнаваемая особенность заключается в том, что, хотя анонимные внутренние классы не имеют имени, у них есть тип. В интерфейс могут быть добавлены новые методы. Эти методы могут быть вызваны только в ограниченных случаях. Главным образом непосредственно на самом выражении new и внутри класса (включая инициализаторы экземпляров). Это может сбить с толку новичков, но может быть «интересно» для рекурсии.

private static String pretty(Node node) {
    return "Node: " + new Object() {
        String print(Node cur) {
            return cur.isTerminal() ?
                cur.name() :
                ("("+print(cur.left())+":"+print(cur.right())+")");
        }
    }.print(node);
}

(Первоначально я написал это, используя node, а не cur в методе print. Сказать НЕТ захвату «неявно окончательных» местных жителей? )

9
ответ дан 24 November 2019 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: