为什么这个 lambda 可以在这里使用,在 Arrays.sort() 中需要一个比较器

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它与书中所说的不同。

Joa*_*uer 7

equals是 的公共方法java.lang.Object。在识别功能接口时,这些方法明确不计算在内。

在 Java 语言规范中可以找到功能接口是什么(以及因此可以通过 lambda“实现”什么)的真正的、自主的定义。

几乎不可避免地,指南中对函数式接口的定义将没有 Java 语言规范中的定义那么严格和精确(因为后者是用一种不太适合初步学习的语言编写的)概念,并且更适合创建同一事物的多个兼容实现)。

请参阅JLS §9.8 功能接口(强调我的):

对于一个接口I,让M是集合abstract这是成员的方法I不具有相同签名的任何public类的实例方法Object。[...]