JAVA8 方法引用:(四种方法引用的使用)
对象引用的特点:不同的对象可以操作同一块的内容;而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。
引用静态方法:
类名称 :: static 方法名称
引用某个对象的方法:
实例化对象 :: 普通方法
引用特定类型的方法:
特定类 :: 普通方法
引用构造方法:
类名称 :: new
引用静态方法:【在String类中有一个valueOf()方法;】?
/** * 实现方法的引用接口 * @param<P> 引用方法参数的类型 * @param<R> 引用方法返回的类型 */ interface IMessage<P,R> { public R zhuanhuan(P p) ; } public class TestDemo { public static void main(String [] args) { //即:将String(类).valueOf()方法变为了IMessage接口里的zhuanhuan()方法 IMessage<Integer,String> msg = String :: valueOf; String str = msg.zhuanhuan(1000) ; System.out.println(str.replaceAll("0","9")); } }
普通方法引用:
/** * 实现方法的引用接口 * @param<R> 引用方法返回的类型 */ interface IMessage<R> { public R upper() ; } public class TestDemo { public static void main(String [] args) { // String类的toUpperCase()方法的目的是将实例化对象调用该方法 // 本代码中,将toUpperCase()函数的应用交给了IMessage接口的upper方法 IMessage<String> msg = "Hello" :: toUpperCase; String str = msg.upper() ; // 相当于调用 "Hello".toUpperCase() System.out.println(str); } }
【如果要实现函数的引用,那么必须要有接口,并且接口中有且只有一个抽象方法】
>>> 如果函数引用的接口有多个抽象方法则为不合规则,这时需要引用一个注解,说明该接口为函数式接口(函数引用): @FunctionalInterface
在进行方法引用的时候,还有另外的一种形式的引用:(需要特定类的对象支持)
…………………………
引用构造方法:
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 ; //引用Book类中的构造方法 // 调用的create实际上是调用的Book.Book()构造方法 Book book = msg.create("Java Fail",12.2) ; System.out.println(book); } }
对象的引用是使用不同的名字,而方法引用是需要有一个函数式的接口并且设置号参数。