当前位置: 首页 > 知识库问答 >
问题:

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

公孙宏远
2023-03-14

我对Lambda很陌生,以下是教科书(简而言之就是java)所说的:

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

  • BE接口
  • 只有一个非默认方法(但可能有其他默认方法)
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();});

但是它有两个非默认方法compareequals

共有1个答案

司空福
2023-03-14

equalsjava.lang.object的公共方法。在标识功能接口时,这些方法不被显式计算在内。

在Java Langauge规范中可以找到什么是函数接口(以及什么可以通过lambda“实现”)的真正的自动定义。

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

对于接口i,让Mi的成员的abstract方法集,这些方法不具有与类Object的任何public实例方法相同的签名。[...]

 类似资料:
  • 问题内容: 我有一个熊猫数据框,我想根据是否满足某些条件进行过滤。我跑了一个循环,然后用来测试速度。数据集大约有45000行。循环的代码片段为: 每个循环1.44 s±3.7毫秒(平均±标准偏差,共7次运行,每个循环1次) 而且是: 每个循环6.71 s±54.6 ms(平均±标准偏差,共7次运行,每个循环1次) 我认为应该比循环遍历大熊猫更快。有人可以解释为什么在这种情况下速度变慢吗? 问题答案

  • 我试图理解,如果可以使用,是什么让并发锁如此重要。在下面的伪代码中,我可以执行以下任一操作: 同步整个方法或同步脆弱区域(

  • 问题内容: 这就是我遇到问题的方式。我举一个例子: 这可以。现在,我想通过扩展创建一个子类。所以我写道: 一写完,Eclipse中就出现了一个十字架,单击它,我发现了一条消息: 我用谷歌搜索了问题并添加了 Eclipse也建议这样做。现在我有两个问题。 为什么必须强制使用构造函数?AFAIK不需要创建构造函数,因为JAVA编译器会自动创建默认构造函数以继续其操作。同样从消息中,似乎还需要一个默认的

  • 我发现了一个很受欢迎的问题的答案,下面的代码是: 为什么...是必需的?如果我省略了,巴别就会对我抱怨说: 它看起来像扩展语法,但是一个布尔值。我找不到能解释到底发生了什么的医生。

  • 我现在正在学习遗传和多态性,除此之外,我也理解它。为什么我需要投三个。setY()不应该已经可以访问它了,因为我正在创建一个从G类继承的H对象。 第8行是语法错误。

  • 对于我的Java类,我需要在给定以下函数头的情况下创建一个函数体: