JDK1.8之方法引用(方法别名/函数式接口声明/Spring分层实现基础)

image.png

1.四种方法引用

这里区别于对象引用:对象引用是不同的对象可以操作同一块内容
而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字。

方法引用的四种形式:

1.引用静态方法:类名称::static 方法名称
2.引用某个对象的方法:实例化对象::普通方法
3.引用特定类型的方法:特定类::普通方法
4.引用构造方法:类名称::new(DAO模式实现的基础)

范例:引用静态方法
在String类里面有一个valueOf()方法:public static String valueOf(int x)

package TestDemo;
/**
 * 实现方法的引用接口
 * @param 

引用方法的参数类型 * @param 引用方法的返回类型 */ interface IMessage{ public R exchange(P p); } public class TestDemo{ public static void main(String[] args) { //即:将String.valueOf()方法变味了IMessage接口里面的exchange()方法 IMessage msg=String::valueOf; String str=msg.exchange(1000); System.out.println(str.replace("0", "9")); } }

将String.valueOf()方法变为了IMessage接口里面的exchange()方法

结果:


image.png

范例:实例化对象的普通方法引用

package TestDemo;
/**
 * 实现方法的引用接口
 * @param  引用方法的返回类型
 */
interface IMessage{
    public R upper();
}

public class TestDemo{
    
    public static void main(String[] args) {
        //即:String类的toUpperCase方法定义:public String toUpperCase()
        //这个方法没有参数,有返回值,无static修饰,需要实例化String对象才可以引用这个方法
        //"hello"是一个String类实例化对象,可以调用toUpperCase()方法,将此函数的引用交给IMessage接口的upper方法
        IMessage msg="hello"::toUpperCase;
        String str=msg.upper();
        System.out.println(str);
    }
}

结果:


image.png

通过以上例子我们发现,要实现方法引用,那么必须要有接口,接口里面只能由一个方法,要实现接口中只有一个方法,那么就需要增加一个注解的声明。@functionalInterface(函数式接口声明)

/**
 * 实现方法的引用接口
 * @param  引用方法的返回类型
 */
@FunctionalInterface
interface IMessage{
    public R upper();
}

在进行方法引用的过程里面,还有
3.另一种形式的引用(需要特定类的对象支持)
例如:String类的compareTo
public int compareTo(String anotherString)
比较形式:字符串1对象.compareTo(字符串2对象),也就是说如果真要引用这个方法,要准备两个参数

package TestDemo;
/**
 * 
 * @param P 比较的两对象
 */
@FunctionalInterface
interface IMessage

{ public int compare(P p1,P p2); } public class TestDemo{ public static void main(String[] args) { IMessage msg=String::compareTo; System.out.println(msg.compare("A","B")); } }

结果A的ASCII码小于B,所以为-1
与之前相比,方法引用前不再需要定义对象,二十可以理解为将方法定义在了参数上。

范例:引用构造方法(Spring中DAO分层实现基础)

package TestDemo;
/**
 * 
 * @param P 比较的两对象
 */
@FunctionalInterface
interface IMessage{
    public C create(String title,double price);
}
class Book{
    private String title;
    private double price;
    public Book(String title,double price){
        this.price=price;
        this.title=title;
    } 
    @Override
    public String toString() {
        return "Book:"+this.title+"Price:" + this.price;
    }
}
public class TestDemo{
    
    public static void main(String[] args) {
        
        IMessage msg=Book::new;//引用Book类的构造方法
        //调用的虽然是create。但是这个方法引用的是Book类的构造
        Book book=msg.create("Java Developer", 20.2);//这里是不是很像Impl的实现呢
        System.out.println(book);
    }
}

结果:


image.png

你可能感兴趣的:(JDK1.8之方法引用(方法别名/函数式接口声明/Spring分层实现基础))