如何在java中为两个或多个匿名函数编写lambda表达式?

时间:2014-05-15 12:17:06

标签: java java-8

假设我有接口A ,它只有一个声明如下的方法:

interface A{        
    void print();           
}

现在使用旧的java风格,我们将以匿名的方式使用它,如下所示:

new A() {           
        @Override
        public void print() {
            System.out.println("in a print method");                
        }           
};

并且使用lambda表达式我们将如下所示使用它:

() -> "A1";

现在我的问题是接口A是否有两个声明如下的方法:

interface A{        
   void print();    
   void display();          
}

及其旧的匿名函数利用方式如下:

  new A() {         
        @Override
        public void print() {
            System.out.println("in print");

        }

        @Override
        public void display() {
            System.out.println("in display");

        }       

    };

现在如何将display方法转换为lambda?或者我们不被允许这样做;如果不是为什么不呢?为什么我们不能像

那样代表它
  

print() - > "印刷"

  

display() - > "显示"

2 个答案:

答案 0 :(得分:8)

你不能。 lambda表达式只能用于" functional" interface - 只有一个非默认方法的接口。

对于"为什么"你不得不问语言设计师,但我的看法是lambda表达式是单个代码块的简写,而一组作为一个单元处理的相关块会更好代表一个适当的阶级。对于像问题中的示例一样的情况,真正的答案是修改API,以便不使用带有两个方法的单个A接口,而是为两个函数APrinter使用两个独立的功能接口, ADisplayer,然后可以由单独的lambdas实现。

答案 1 :(得分:2)

您可以通过为两种方法之一提供默认实现,将A“转换”为功能界面,例如:

public interface B extends A {
    default void print() {}
}

B lambda = () -> displaySomething();

或者,您可以提供a static factory