一直以来我们都只是在对象上看见引用的身影,而对象引用的特点,就是不同的对象能够操作同一块内容,方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字
方法引用在JAVA8之中一共定义了四种形式:
1、引用静态方法:类名称 :: static方法名称 ;
2、引用某个对象的方法: 实例化对象 :: 普通方法 ;
3、引用特定类型的方法 : 特定类 :: 普通方法 ;
4、引用构造方法: 类名称 :: new 。
注意:要实现方法引用的接口只能定义一个方法,所以我们可以在接口前面使用 @FunctionalInterface(函数式接口声明) ,表示此接口只能定义一个方法,如果超过一个,将会报错
1、引用静态方法:
/**
实现方法的引用接口
P表示方法的参数类型
R表示方法的返回值类型
*/
@FunctionalInterface
interface IMessage<P,R>{//定义接口
public R conversion(P p) ;
}
public class Demo{
public static void main (String [] args){
//将String类的valueOf()方法变为IMessage接口里的conversion()方法
//valueOf()方法可以接受int型数据,返回String型数据
IMessage<Integer,String> msg = String :: valueOf ;
String str = msg.conversion(1000);//调用引用方法进行操作
//将接受到的int型整数中所有的0换为9输出
System.out.println(str.replaceAll("0","9")) ;
}
}
//程序执行结果:1999
2、引用某个对象的方法:
注意:引用没有参数的普通方法必须是要在有实例化对象的情况下才可以调用
@FunctionalInterface
interface IMessage<P>{
public P conversion() ;
}
public class Demo{
public static void main (String [] args){
//将String的toUpperCase()方法变为IMessage接口的conversion()方法
//此方法没有参数,但是有返回值,并且这个方法一定要在有实例化对象的情况下才可以调用
IMessage<String>msg = "hello" :: toUpperCase ;
//相当于使用了String.toUpperCase()方法。
String str = msg.conversion() ;//调用方法操作数据
System.out.println(str) ;
}
}
//运行结果:HELLO
3、引用特定类型的方法:
@FunctionalInterface
interface IMessage<P>{
public int conversion(P p1 , P p2) ;
}
public class Demo{
public static void main (String [] args){
//将String的compaerTo()方法变为IMessage接口的conversion()方法
IMessage<String>msg = String :: compareTo ;
System.out.println(msg.conversion("A","B")) ;
}
}
//运行结果:-1
4、引用构造方法:
@FunctionalInterface
interface IMessage<P>{
//引用构造方法
public P conversion(String title , double price ) ;
}
class Book{
private String title ;
private double price ;
public Book(String title , double price ){//有两个参数的构造方法
this.title = title ;
this.price = price ;
}
@Override
public String toString(){//重写toString()方法
return "书名:" + this.title + ",价格:" + this.price ;
}
}
public class Demo{
public static void main (String [] args){
IMessage<Book> msg = Book :: new ; //引用构造方法
//虽然调用的是conversion()方法,但是这个方法引用的是Book类的构造方法!
Book book = msg.conversion("JAVA开发",89.9) ;
System.out.println(book) ;
}
}
//运行结果:书名:JAVA开发,价格:89.9