6.3.4 方法引用
2018-06-18 02:27:26来源:未知 阅读 ()
有时,可能已经有现成的方法可以完成你想要传递到其他代码的某个动作。
例:假设你希望只要出现一个定时器事件就打印这个事件对象。当然,可以调用:
Timer t =new Timer(1000,event -> System.out.println(event));
但是,如果直接把println 方法传递到Timer构造器就更好了。具体的做法如下:
Timer t = new Timer(1000,System.out.println(event));
表达式System.out::println 是一个方法引用(method reference),它等价于lambda表达式x -> System.out.println(x)。
再来看一个例子,对字符串排序,而不考虑字母的大小写。可以传递已下方法表达式:
Arrays.sort(strings,String::compareToIgnoreCase)
从这些例子可以看出,要用::操作符分隔方法名与对象或类名。主要有三种情况:
object :: instanceMethod
Class :: staticMethod
Class :: instanceMethod
在前2种情况中,方法引用等价于提供方法参数的lambda表达式。前面已经提到,System.out::println 等价于x -> System.out.println(x). 类似的,Math::pow等价于(x,y) -> Math.pow(x,y)。
对于第三种情况,第一个参数会成为方法的目标。例如,String::compareToIgnoreCase 等同于(x,y) -> x.compareToIgnoreCase(y)。
类似于lambda表达式,方法引用不能独立存在,总是会转换为函数式接口的实例。可以在方法引用中使用this参数,例:
this::equals等同于 x -> this.equals(x)。使用super也是合法的。下面的方法表达式
super::instanceMethod
使用this作为目标,会调用给定方法的超类版本。
例:
1 class Greeter 2 { 3 public void greet() 4 { 5 System.out.println("Hello,world!"); 6 } 7 } 8 class TimedGreeter extends Greeter 9 { 10 public void greet() 11 { 12 Timer t =new Timer (1000,super::greet); 13 t.start(); 14 } 15 }
TimerGreeter.greet 方法开始执行时,会构造一个Timer,它会在每次定时器滴答时执行super::greet方法。这个方法会调用超类的greet方法。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:POI操作Excel
- 类的继承,方法重新中修饰符如何定义 2020-06-10
- java里面main方法中的String[]args 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- 学习笔记之方法引用 2020-06-06
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
