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");
你得到的结果都是一样的。
给定以下代码,有人可以解释为什么断言 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");
你得到的结果都是一样的。