Cyb*_*lin 2 java lambda functional-programming java-stream
我是 Lambda 的新手,这是教科书(简而言之 java)所说的内容:
只有某些类型才有资格成为 lambda 的目标。目标类型也称为功能接口,它们必须:
- 成为接口
- 只有一种非默认方法(但可能有其他默认方法)
这本书给了我一个例子:
File dir =new File("/src");
String[] fileList =dir.list((d,fName)->fName.endWith(".java"))
Run Code Online (Sandbox Code Playgroud)
我知道这个 lambda 会转换成一个FilenameFilter
接口,@FunctionalInterface
它确实与书中的描述相符
但是我可以在这里使用 lambda 来sort()
期望收到一个Comparator
int n =12;
Function<String,String[]> f = (s) -> {
String[] ans = new String[n];();
for (int i = 0; i < n; i++) {
ans[i] = s;
}
return ans;};
Arrays.sort(f.apply("colin"),(String s1 ,String s2)->{
return s1.length() - s2.length();});
Run Code Online (Sandbox Code Playgroud)
我查看了它的源代码,发现Comparator
是一个@FunctionInterface
但它有两个非默认方法compare
和。equals
它与书中所说的不同。
equals
是 的公共方法java.lang.Object
。在识别功能接口时,这些方法明确不计算在内。
在 Java 语言规范中可以找到功能接口是什么(以及因此可以通过 lambda“实现”什么)的真正的、自主的定义。
几乎不可避免地,指南中对函数式接口的定义将没有 Java 语言规范中的定义那么严格和精确(因为后者是用一种不太适合初步学习的语言编写的)概念,并且更适合创建同一事物的多个兼容实现)。
请参阅JLS §9.8 功能接口(强调我的):
对于一个接口
I
,让M
是集合abstract
这是成员的方法I
是不具有相同签名的任何public
类的实例方法Object
。[...]