Java中的方法引用.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java8中的方法引用 对一个类某个方法进行引用。方式大致为: 类型::方法名(构造方法为类型::new) 对象::方法名 例子:String的静态方法valueOf对应的方法引用为String::valueOf,Object的构造方法对应的方法引用为Object::new 调用对象o的实例方法hashCode对应的方法引用为o::hashCode 方法引用有什么用? 在讲方法引用有什么用之前,先引见一下lambda表达式 Lambda表达式 在Java8消灭之前,当我们需要创建某个接口的一个实例时,通常的做法是: 创建接口的一个实现类,然后通过该类来创建实例 interface?A?{ ????void?say(String?s); } class?AImpl?implemnets?A?{ ????@Override ????public?void?say(String?s)?{ ????????System.out.println(s); ????} } A?a?=?new?AImpl(); 通过匿名内部类的方式 interface?A?{ ????void?say(String?s); } A?a?=?new?A()?{ ????@Override ????public?void?say(String?s)?{ ???????System.out.println(s); ????} } 假照实现类只会被使用一次,通过匿名内部类的方式更简约。 有相当一部分接口实际上只要一个笼统方法(default方法不是抽像方法),对于这样的接口,我们称之为函数式接口。比如Comparator、Runnable等接口。 jdk中的函数式接口的声明处一般都有@FunctionalInterface注解,加上这个注解的接口,假如不满足函数式接口的规范(只要一个笼统方法),编译器就会报错。 对于函数式接口,Java8引入lambda表达式来进一步简化匿名内部类的写法,因而非函数式接口是不能用lambda表达式的方式来创建接口的实例。lambda表达式在很多言语中都有,比如在 JavaScript中是=表示的函数写法,在Java中则是-。 Lambda表达式的方式: (参数1,参数2,...)?-?{ ????//?笼统方法实现的代码块 ????... } 假如参数只要1个,则可以省略掉括号 假如代码块中只要一行代码,则可以省略掉花括号和代码块结尾的分号 假如代码块中只要一条语句,且该语句为return语句,则可以将return省略 一个比较简短的lambda表达式长这样: a?-?a+1 ()?-?System.out.println(hello world!) 进一步简化lambda表达式 方法引用的引出是为了简化代码,简化什么代码呢?答案就是简化lambda表达式,而且是对于只要一行代码的lambda表达式。下面来看几个案例: 将一个整型数字转换成对应的字符串 //?接口 interface?A?{ ???String?m(Integer?i); } //?创建A的一个实例,lambda表达式写法 A?a?=?i?-?String.valueOf(i); a.m(1);?//?输出?1 将一个整型字符串转换成整型数字 //?接口 interface?A?{ ???Integer?m(String?s); } //?创建A的一个实例,lambda表达式写法 A?a?=?s?-?Integer.valueOf(s); a.m(1);?//?输出?1 对于上面的两个lambda表达式,都是这样的一种情况:lambda的形参作为某个静态方法的实参传入,在实际编程中有太多类似的这样的情况,因而对于这种代码,引入了方法引用进行简化,以上两个lambda表达式用方法引用的写法如下: A?a?=?String::valueOf A?a?=?Integer::valueOf 方法引用的几种方式 下面引见我总结的几种方法引用的转换方式: 类名::静态方法名 对象::实例方法名 类名::实例方法名 类型::new(构造方法的引用) 类名::静态方法名 lambda表达式中调用某个类的静态方法,且lambda的形参作为静态方法的参数传入,并且lambda的方法前往类型要和实例方法的前往类型对应上。如: str?-?Integer.parseInt(str)? 对应的方法引用: Integer::parseInt 接受擦除法,去掉左右两边全都的参数表 对象::实例方法名 lambda表达式中调用某个对象的某个方法,并且lambda的形参作为该方法的实参,并且lambda的方法前往类型要和实例方法的前往类型对应。如: class?A?{ ??void

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档