Java 函数式接口和 Lambda 表达式

Java Functional Interfaces and Lambda Expressions

给定以下代码,有人可以解释为什么断言 returns 为真吗?尽管进行了无数次搜索,但对于为什么会出现这种情况,以及 Java 功能导致此行为的原因以及我在类似情况下会有哪些限制/要求,我仍然无法得到任何适当的答案创建这样的界面。

interface X {
  default int foo() {return 1;}
  String bar();
}

public class Exercise{
  public static void main(String[]arg){
    X foo1=()->"hello";
    assert (foo1.bar()).equals("hello");
  }
}

由于方法 foo() 具有默认实现,您只需指定 bar() - 您可以使用 X foo1 = ()->"hello".

那么,你的foo1.bar()returns你好。

UPD: 我的回答可能不清楚,所以我应该注意 'foo' 没有被编译器视为抽象方法(这让你的接口 X满足声明功能接口的要求)。布赖恩在他的回答中解释得更清楚、更详细。

lambda 表达式是一种创建函数式接口 实例的简洁方法,函数式接口 是具有一个抽象方法的接口。这里,X是一个函数式接口,带有抽象方法bar()。您可以通过以下方式实现 X:

class XImpl implements X { 
    public String bar() { return "Foo"; }
}

X instance = new XImpl();

或匿名 class

X anon = new X() { 
    public String bar() { return "foo"; }
};

或 lambda

X lambda = () -> "foo";

其中每一个都实例化了 X 的实现。可能让您感到困惑的是 lambda 的简洁性;因为 X 只有一个抽象方法,bar,你不必说你正在实现 bar —— 编译器会计算出来。由于 bar() 不带参数并且 returns String,编译器确保 lambda 的形状与唯一抽象方法的形状兼容。

因为 X 有一个 bar() 方法, 您可以在这些实例中的每一个上调用它:

String s1 = instance.bar();
assertEquals(s1, "hello");

String s2 = anon.bar();
assertEquals(s2, "hello");

String s3 = lambda.bar();
assertEquals(s3, "hello");

你得到的结果都是一样的。