如果目标类有多个接口方法,有没有办法使用lambdas?或者你只需要在这种情况下使用匿名内部类?
答案 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中用于创建侦听器对象。