Java 函数式接口(interface)和 Lambda 表达式

标签 java lambda functional-interface

鉴于以下代码,有人可以解释为什么断言返回 true 吗?尽管进行了无数次搜索,但我无法得到任何适当的答案来说明为什么会出现这种情况,以及 Java 功能导致这种行为的原因以及在类似地创建这样的接口(interface)时我会有哪些限制/要求像这样。

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");
  }
}

最佳答案

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

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

X instance = new XImpl();
或匿名类
X anon = new X() { 
    public String bar() { return "foo"; }
};
或 lambda
X lambda = () -> "foo";
这些中的每一个都实例化了 X 的实现。 .可能让您感到困惑的是 lambda 的简洁性;因为X只有一个抽象方法,bar ,您不必说您正在实现 bar -- 编译器算出来了。由于bar()不带参数并返回 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");
你会得到相同的结果。

关于Java 函数式接口(interface)和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63035160/

相关文章:

java - Lucene 和 Google App Engine

c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?

ruby-on-rails - 带有静态方法的 Ruby 动态 lambda

java - 意外的 Java 功能接口(interface)转换

java - 哪个更快 : Array list or looping through all data combinations?

java - 可以在java中创建自定义jpa注释

java - Maven部署插件不工作

android - 如何将自定义类转换为 lambda?

java - 按照 Eclipse 中的功能接口(interface)生成具有正确签名的方法

java - 使用 List<UnaryOperator<...>> 映射对象