java接口中仅有一个方法,作为参数时匿名实现

学习到多线程的实现方式时,其中之一是实现Runnable,代码如下:

new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("thread 1 running");
    }
}).start();

由于Runnable接口中仅含有一个方法,可以将代码进一步简化:

new Thread(()->{
    System.out.println("thread 2 running");
}).start();

当然,这种实现方式仅仅在接口中仅有一个方法,方可,否则报错,代码如下:

public class Test {

interface InterfaceSample{
    void show();
    //void test();//两个方法以下参数传递出错
}

public void testInterfaceSample( InterfaceSample func) {        
    func.show();
}
public static void main(String[] args) {
    // TODO Auto-generated method stub

    new Test().testInterfaceSample(()->{
        System.out.println("hello word");
    });
}

具体为什么可以这么写,请java大佬们帮忙解答一下,谢谢

这是lambda表达式,为了尽可能向前兼容(因为之前的代码都是基于接口+单方法),尽可能不要破坏原来代码的兼容性。
所以增加了这个约定,也就是接口+单方法,可以用lambda表示。