方法引用
掌握四种方法的引用使用。
具体内容
一直以来都只是在对象上能否发现引用的身影,而对象引用的特点:不同的对象可以操作同一块内容,方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。
方法引用在Java8之中一共定义了四种形式:
·引用静态方法:类名称 ::static 方法名称;
·引用某个对象的方法:实例化对象 :: 普通方法;
·引用特定类型的方法:特定类 :: 普通方法;
·引用构造方法: 类名称 ::new 。
示例:引用静态方法
· 在 String类里面有一个 valueOf() 方法: public static String valueOf (int x);
· /**
* 实现方法的引用接口
* @param <P> 引用方法的参数类型
* @param <R> 饮用方法的返回类型
*/
interface IMessage<P,R>{
publicR zhuanhuan(P p);
}
public class TestDemo{
publicstatic void main(String[]args) {
//即:将String.valueOf()方法变成了IMessage接口里的zhuanhuan()方法
IMessage<Integer,String> msg = String :: valueOf;
Stringstr = msg.zhuanhuan(1000);
System.out.println(str.replaceAll("0","9"));
}
}
示例:普通方法引用
interface IMessage<R>{ public R upper(); } public class TestDemo{ public static void main(String[] args) { // String类的toUpperCase() 定义public String toUpperCase() //这个方法没有参数,但是有返回值,并且这个方法一定要在有实例化的情况下才可以调用 //"hello"这个字符串是String类的实例化对象,所以可以直接调用toUpperCase()方法 //将toUpperCase()函数的应用交给了IMessage接口 IMessage<String> msg = "hello" :: toUpperCase; String str = msg.upper(); //相当于"hello".toUpperCase()方法 System.out.println(str); } }
· 通过两个代码演示应该已经发现了,如果要实现函数的引用,那么必须要有接口,而且最为关心的是,接口需要只存在一个方法。方法时无法进行引用的。
所以为了保证被引用接口里面只能够有一个方法,那么就需要增加一个注解的声明。
@FunctionalInterface //此函数式接口,只能够定义一个方法
在进行方法引用的过程里面还有另外一种形式的引用(需要特定类的支持),正常情况下如果使用了“类 :: 方法”引用的一定是类中的静态方法,但是这种形式也可以引用普通方法。
例如:在String类中有一个方法:compareTo
如果要比较的话,比较的形式:字符串1对象.compareTo(字符串2对象),也就是说如果真要引用这个方法就需要准备出两个参数。
示例:特定类型的引用
interface IMessage<P>{ public int compare(P p1,P p2); } public class TestDemo{ public static void main(String[] args) { IMessage<String> msg = String::compareTo; System.out.println(msg.compare("A","B")); } }
与之前相比,方法引用前不在需要定义对象,而是可以理解为将对象定义在了参数上。
示例:引用构造方法
interface IMessage<C>{ public C create (String t , double p ); } class Book{ private String title; private double price; public Book(String title, double price){ this.title = title; this.price = price; } @Override public String toString() { return "书名:"+ this.title + ",价格:" + this.price; } } public class TestDemo{ public static void main(String[] args) { IMessage<Book> msg = Book::new; //调用的虽然是create(),但是这个方法引用的事Book类的构造,事先了构造方法的引用 Book book = msg.create("java开发",20.2); System.out.println(book); } }
对象的引用是使用不同的名字,而方法引用是需要一个函数式接口,并且要设置好参数。
总结:
四种方法的引用基本的形式如上,但是是否去使用。不!