java - Java如何处理实例方法的方法引用?
问题描述
我正在阅读Oracle 的 Java SE 关于方法引用的教程,我遇到了方法引用解析实例方法的机制的问题。
在本教程中,有一个使用方法引用作为Comparator<String>
参数的片段。
Arrays.sort(stringArray, String::compareToIgnoreCase);
我认为Comparator<String>
应该实现一个对象,compare(String, String)
而不是采用一个显式参数的实例方法。Java 的编译器如何处理这个问题,或者在编译时发生了什么?
在了解了 JVM 之后,我了解到隐式参数是作为参数传递的。但这并没有帮助我理解 Java 编译器如何处理这个方法引用。
有人可以帮我找到这方面的教程或文档吗?我需要更多了解哪个部分?
解决方案
String::compareToIgnoreCase
符合,Comparator<String>
因为它确实接受两个字符串参数并返回一个 int。第一个参数是调用实例方法的 String 实例。第二个参数是要传递给该实例方法的(单个)参数。
和这个一样
(a, b) -> a.compareToIgnoreCase(b)
或更详细地说
(String a, String b) -> {
return a.compareToIgnoreCase(b);
}
所以是的,compareToIgnoreCase
只需要一个参数,但String::compareToIgnoreCase
需要两个。
"foo"::compareToIgnoreCase
将其与(或说,someSpecificStr::compareToIgnoreCase
)进行对比。在这里,实例已经被绑定,所以它只需要一个参数。
推荐阅读
- javascript - 通过道具 React 将 WS 连接传递给孩子
- excel - 如何将多个 ID 汇总为单个类别?
- for-loop - Lua中pairs()和ipairs()的区别是什么?
- javascript - 有没有办法直接访问 CSS 网格中自动放置元素的实际网格坐标?
- python - Python 数组元素分离
- c# - OneToMany 添加新记录?
- visual-c++ - VTK - 从 6.1 迁移到 8.2
- javascript - 使用 LocalStorage 保存和加载购物车
- python - Python将两个列表排序在一起?
- docusignapi - 嵌入式和电子邮件签名相结合