【问题标题】:Why this lambda can be used here where expects a comparator in a Arrays.sort() [duplicate]为什么可以在此处使用此 lambda,其中需要 Arrays.sort() 中的比较器 [重复]
【发布时间】:2021-04-13 15:24:04
【问题描述】:

我是 Lambda 的新手,这是教科书(简而言之是 java)所说的:

只有某些类型有资格成为 lambda 的目标。 目标类型也称为功能接口,它们必须:

  • 成为接口
  • 只有一种非默认方法(但可能有其他默认方法)

这本书给了我一个例子:

File dir =new File("/src");
String[] fileList =dir.list((d,fName)->fName.endWith(".java"))

我知道这个 lambda 将转换为 FilenameFilter 接口,这是一个 @FunctionalInterface 它确实符合书中的描述

但是,当 sort() 期望收到 Comparator 时,我可以在这里使用 lambda

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

我查看它的源代码发现Comparator@FunctionInterface

但是它有两个非默认方法compareequals。和书上说的不一样。

【问题讨论】:

  • 我冒昧地删除了您(否则说得好)问题底部的第二个请求,因为 SO 不太适合同时处理多个问题。另外,恐怕您在那里发布的那种请求并不是特别适合整个 SO(一般的“我如何学习 X”类型的指导并不完全适合问答模型它是建立在上面的)。
  • 哦,我明白了。我是新来的,所以我不太明白。对不起

标签: java lambda functional-programming java-stream


【解决方案1】:

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

在 Java 语言规范中可以找到关于什么是函数式接口(以及因此可以通过 lambda“实现”什么)的真实、自动的定义。

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

JLS §9.8 Functional Interfaces(强调我的):

对于接口I,令Mabstract 方法的集合,这些方法是I 的成员,与类@ 的任何public 实例方法的签名不同987654330@。 [...]

【讨论】:

  • 值得注意的是,这个方法完全出现在接口的 JavaDoc 中的原因(与 Iterator 相反)是因为 Comparator 明确声明它,目的向它添加比 Object 提供的更具体的 JavaDoc。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 2014-06-19
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多