JAVA8新特性——方法引用
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~
在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法。然而,有时候我们仅仅是需要调用一个已存在的方法(如java中已经定义好的方法),在这时候java8新特性“方法引用”将会进一步简化操作(注意:需要有Lamda的支持)。
方法引用的四种形式:
- 引用静态方法-->类名称::static 方法名称;
- 引用某个对象的实例的普通方法-->示例化对象::普通方法;
- 引用某个类型的任意对象的实例的普通方法-->特定类::普通方法;
- 引用构造方法-->类名称::new
引用静态方法
如:String类中的valueOf()方法:public static String valueOf(int x);
- /**
- * 实现方法的引用接口
- * @param <P>引用方法的参数类型
- * @param <R>引用方法的返回类型
- */
- interface MyInterface<P,R>{
- public R function(P p);//和String.valueOf(int x)类似
- }
- interface MyInterface1{
- String function(Integer a);
- }
- public class Main {
- public static void test(MyInterface1 myInterface1){
- String result = myInterface1.function(2000);
- System.out.println(result+" --");
- }
- public static void main(String[] args) {
- //匿名内部类实现
- test(new MyInterface1() {
- @Override
- public String function(Integer a) {
- return String.valueOf(a);
- }
- });
- //Lamda表达式实现
- test((a)->String.valueOf(a));
- //方法引用实现:引用类的静态方法
- MyInterface<Integer,String> msg = String::valueOf;
- String str = msg.function(2000);
- System.out.println(str);
- }
- }
引用某个对象的实例的普通方法
如:String类中的toUpperCase()方法:public String toUpperCase();
这个方法没有参数,但是有返回值,并且这个方法一定要在有实例化对象的时候才可以调用。
- interface MyInterface2<R>{
- public R upper();
- }
- public class Main1 {
- public static void main(String[] args) {
- String str = new String("hello");
- MyInterface2<String> msg = str::toUpperCase;
- System.out.println(msg.upper());//调用upper方法,就相当于调用toUpperCase方法
- }
- }
在上面的演示中已经发现,如果要实现方法的引用,就必须要有接口,并且这个接口中只能存在一个方法,否则方法是无法进行引用的。
所以为了保证被引用的接口里面只能够定义一个方法,就要在接口上加以限制,使用@FunctionalInterface 注解。
- @FunctionalInterface //此为函数式接口,只能够定义一个方法
- interface MyInterface2<R>{
- public R upper();
- }
引用某个类型的任意对象的实例的普通方法
比如:String类中的compareTo(String str1,String str2)方法 public int compareTo(String anotherString);
如果要进行比较的话,比较的形式:字符串1对象.compareTo(字符串2对象),要准备两个参数。
- @FunctionalInterface //此为函数式接口,只能够定义一个方法
- interface MyInterface3<P>{
- public int compare(P p1,P p2);
- }
- public class Main2 {
- public static void main(String[] args) {
- MyInterface3<String> msg = String::compareTo;
- System.out.println(msg.compare("A","B"));
- }
- }
与之前相比,方法引用前不需要再定义对象,而是可以理解为将对象定义在了参数中。
引用构造方法
- @FunctionalInterface //此为函数式接口,只能够定义一个方法
- interface MyInterface4<C>{
- public C person(String n,int a);
- }
- class Person{
- private String name;
- private int age;
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "姓名:"+this.name+",年龄:"+this.age;
- }
- }
- public class Main3 {
- public static void main(String[] args) {
- MyInterface4<Person> msg = Person::new;//引用构造方法
- Person person = msg.person("小明",20);
- System.out.println(person);
- }
- }
小结:有点毁三观的感觉!
JAVA8新特性——方法引用的更多相关文章
- Java8 新特性 方法引用
什么是方法引用 方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式.比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用 ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
- java8新特性-方法引用
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...
- Java8新特性 - 方法引用与构造器引用
方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...
- Java8新特性之方法引用&Stream流
Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...
- Java8新特性—四大内置函数式接口
Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
随机推荐
- [HAOI2012] 容易题[母函数]
794. [HAOI2012] 容易题 ★★☆ 输入文件:easy.in 输出文件:easy.out 简单对比时间限制:1 s 内存限制:128 MB 秒 输入:easy.in 输出: ...
- 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增
[BZOJ1977][BeiJing2010组队]次小生成树 Tree Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C ...
- 64位matlab mex64位编译器解决方案
安装libsvm的时候用到了mex -setup,有的会报 Could not find the 64-bit compiler. This may indicate that the "X ...
- Django分发控制器urls--白话聊Django系列
开始前,先上一张图,让理解Django内部的处理流程,从图中我们可以知道Django内部使用MTV架构,那今天讲的第一个部分就是控制器,在Tornado框架中叫做路由系统,负责把url映射到相应的处理 ...
- 正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询
查看表相关命令 - 查看表结构 desc 表名- 查看生成表的SQL show create table 表名- 查看索引 show index from 表名 使用索引和不使用索引 由 ...
- PAT 1067. 试密码(20)
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过20的.不包含空格.Ta ...
- Java关键字this
Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静 ...
- Linux服务管理(开启关闭防火墙)
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- re模块(Python中的正则表达式)
re模块 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- Hub,bridge,switch and router的区别
首先说HUB,也就是集线器.它的作用可以简单的理解为将一些机器连接起来组成一个局域网.而交换机(又名交换式集线器)作用与集线器大体相同.但是两者在性能上有区别:集线器采用的式共享带宽的工作方式,而交换 ...