如何将lambdas用于具有多种方法的接口?

时间:2014-04-14 00:22:46

标签: java oop lambda java-8

如果目标类有多个接口方法,有没有办法使用lambdas?或者你只需​​要在这种情况下使用匿名内部类?

2 个答案:

答案 0 :(得分:24)

不,没有。如果我正确地理解了您的问题,那么您希望将lambdas用于具有多个抽象方法的接口。在这种情况下,答案是否定的:

  

功能界面是任何只包含一个界面的界面   抽象方法。 (功能界面可以包含一个或多个   默认方法或静态方法。)因为功能界面   只包含一个抽象方法,可以省略其名称   实现它时的方法。要做到这一点,而不是使用   匿名类表达式,使用lambda表达式 [...]

在那里阅读:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

答案 1 :(得分:0)

不可能直接创建带有lambda的多方法对象。

但是,您可以使用变通办法来解决问题,方法非常简洁:

使用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 new MultiMethodInterface() {
        @Override
        public void method1() {
            methodAction1.run();
        }
        @Override
        public String method2(String arg) {
            throw new UnsupportedOperationException();
        }
    };
}

生成的代码至少比创建匿名类短和漂亮。至少如果该方法的实现比较短,并且/或者仅需要实现其中一种方法。

例如,该技术在SWT toolkit中用于创建侦听器对象。