当前位置: 首页 > 面试题库 >

方法引用转换如何工作?

羊光辉
2023-03-14
问题内容
public class Main {
    interface Capitalizer {
        public String capitalize(String name);
    }

    public String toUpperCase() {
        return "ALLCAPS";
    }

    public static void main(String[] args) {
        Capitalizer c = String::toUpperCase; //This works
        c = Main::toUpperCase; //Compile error
    }
}

两者都是具有相同签名的实例方法。为什么一个起作用而另一个不起作用?

签名String::toUpperCaseString toUpperCase();


问题答案:

引用方法有3种构造:

  1. object::instanceMethod
  2. Class::staticMethod
  3. Class::instanceMethod

该行:

Capitalizer c = String::toUpperCase; //This works

使用3’rd结构- Class::instanceMethod。在这种情况下, 第一个参数成为该方法的目标
。此构造等效于(翻译)以下Lambda:

Capitalizer = (String x) -> x.toUpperCase();

这Lambda表达式工作,因为拉姆达 得到String的参数,并返回String结果-所要求的Capitalizer接口

该行:

c = Main::toUpperCase; //Compile error

转换为:

(Main m) ->  m.toUpperCase();

哪个不适用于该Capitalizer界面。您可以更改Capitalizer为:

interface Capitalizer {
    public String capitalize(Main name);
}

此更改Main::toUpperCase后将进行编译。



 类似资料:
  • 我对方法引用在Java8中是如何工作的有些困惑。我编写了下面的代码段用于过滤文件夹中的隐藏文件。他们正在产生正确的结果。我不理解->listFiles方法的方法签名是如何在这个代码段的选项2中工作的。 这是我在Java8文档中发现的

  • 我编写了一些通用bean转换,它们一起使用来转换一个复杂的bean。有时输入bean具有双向引用,转换器陷入无限循环。我该怎么处理呢? 例如,输入是一个与B bean有关系的bean,而B bean恰恰与A实例有关系。当转换A对象开始时,B转换器调用转换A中的B字段,并且在转换B对象时,A转换器调用转换B类中的A字段,如您所知,转换器陷入无限循环。想想bean之间更复杂的关系,即关系图有两个以上的

  • 问题内容: 使用以下DataFrame,如何在不让Pandas将移位后的值分配给其他索引值的情况下基于索引来移位“ beyer”列? 生产… 问题在于,佩恩特得到了分配最后一位战士的啤酒。相反,我希望它像这样… 问题答案: 使用应用转移到各组分别:(感谢Jeff指出这个简化) 如果您有一个多索引,则可以通过将一系列或级别名称传递给 参数来对多个级别进行分组。

  • 我正在对我的表数据实现引导折叠。但是,当我按下按钮时,表数据确实会折叠,但没有转换。我已经确认我包括了jQuery,我正在使用collapse和not collapse in,我正在使用aria hidden=“true”data toggle=“collapse”数据目标和id。这不是屏幕宽度问题。 这是一个链接到我的代码笔https://codepen.io/mezavanessa/pen/R

  • 问题内容: 我对Python引用感到困惑。考虑以下示例: 我的任务: 编辑列表中的每个元素 类似地: 在python中,所有内容都按引用进行操作,那么何时创建新对象?我们总是需要和从模块,使对象副本? 请说清楚。 问题答案: 在Python中,变量不是容纳事物​​的盒子,它是指向对象的名称。在您的代码中: ->将名称绑定到字典 ->将名称绑定到列表 ->将名称绑定到另一个列表 您的第三行不是在改变

  • 本文向大家介绍vue-cli如何引入bootstrap工具的方法,包括了vue-cli如何引入bootstrap工具的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍了vue-cli如何引入bootstrap工具的方法,分享给大家,也给自己留个笔记。 以下操作以正常安装node环境为前提。 1.引入jq: 在npm控制台中,进入项目目录,然后输入指令npm install jquery --