Подтвердить что ты не робот

Как использовать лямбды для интерфейсов с несколькими методами?

Есть ли способ использовать лямбда-выражения, если целевой класс имеет более одного метода интерфейса? Или вам просто нужно использовать анонимный внутренний класс в этом случае?

4b9b3361

Ответ 1

Нет, нет. Если бы я правильно понял ваш вопрос, вы бы хотели использовать lambdas для интерфейсов с более чем одним абстрактным методом. В этом случае ответ отрицательный:

Функциональный интерфейс - это любой интерфейс, содержащий только один абстрактный метод. (Функциональный интерфейс может содержать один или несколько методы по умолчанию или статические методы.) Поскольку функциональный интерфейс содержит только один абстрактный метод, вы можете опустить имя этого когда вы его реализуете. Для этого вместо использования анонимное выражение класса, вы используете выражение лямбда [...]

Прочитайте его там: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

Ответ 2

Невозможно напрямую создать объект с несколькими методами с помощью лямбды.

Но вы можете использовать обходной путь для решения проблемы довольно аккуратно:

Используйте метод util, который принимает несколько объектов с одним методом в качестве аргументов и возвращает объект с несколькими методами, в который были упакованы объекты с одним методом.

Пример:

interface MultiMethodInterface {
    void method1();
    String method2(String arg);
}

public static void example() {
    // One lambda for each method, they are packed into a 
    // MultiMethodInterface object by the multiMethodInterface method
    MultiMethodInterface i1 = createMultiMethodObject(
            () -> System.out.println("method1"),
            arg -> "method2: " + arg);

    // Sometimes only one of the methods is used, a specialized wrapper
    // can be used if that is common
    MultiMethodInterface i2 = 
            createMethod1Wrapper(() -> System.out.println("method1"));
}

public static MultiMethodInterface createMultiMethodObject(
        Runnable methodAction1,
        Function<String, String> methodAction2)
{
    return new MultiMethodInterface() {
        @Override
        public void method1() {
            methodAction1.run();
        }
        @Override
        public String method2(String arg) {
            return methodAction2.apply(arg);
        }
    };
}

public static MultiMethodInterface createMethod1Wrapper(Runnable methodAction1) {
    return createMultiMethodObject(methodAction1, arg -> "");
}

Результирующий код, по крайней мере, немного короче и красивее, чем создание анонимного класса. По крайней мере, если реализации метода короткие, и/или нужно реализовать только один из методов.

Этот метод используется, например, в SWT toolkit, для создания объектов слушателя.