方法引用基本介绍和通过对象名引用成员方法

方法引用

在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么动作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同的方案,那是否还有必要再写重复逻辑?

冗余的Lambda场景

来看一个简单的函数式接口以应用Lambda表达式

@FunctionalInterface
public interface Printable{
void print(String str);
}

再Printable接口当中唯一的抽象方法print接受一个字符串参数,目的就是为了打印显示它。那么通过Lambda来使用它的代码很简单

public class PrintSimple {
private static void printString(printable date){
date.print("Hello,World");
}
/*
分析:
Lambda表达式的目的,打印参数传递字符串
吧参数s,传递给了System.out对象,调用out对象中的方法Pringln对字符串进行输出
注意:
1.System.out对象是已经存在的
2.Pringln方法也是已经存在的
所以我们可以直接使用方法来引用来优化Lambda表达式
可以使用System.out方法直接引用println方法
*/
/*
"::"为引用运算符,而它所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在于某个方法的实现中
那么则可通过双冒号来引用该方法作为Lambda的替代者

语法分析:
例如上例中,System.out对象中有一个重载的println(String)方法恰好就是我们所需要的。那么对于printString方法的函数式接口参数,对比下面两种写法完全等效
Lambda表达式写法:s->System.out.println(s);
方法引用写法:System.out::println
第一种语法是指:拿到参数之后经Lambda之手,继续传递给System.out.println方法去处理
第二种等效写法语义是指:直接让System.out中的println方法来取代Lambda。两种写法的执行效果完全一样,而第二种方法引用的写法服用了已有的方案,更加简介
Lambda中传递的参数一定要是方法引用中的那么个方法可以接受的类型,否则会抛出异常
*/
printString(System.out::println);

public static void main(String[] args){
printString(s-> System.out.println(s));
}
}

通过对象名引用成员方法

这是最常见的一种用法,与上例相同。如果一个类中存在了一个成员方法

package com.yang.Test.demo01;

public class T1 {
    //定义一个成员方法,传递字符串,吧字符串按照大写输出
    public void printUpperCaseString(String str){
        System.out.println(str.toUpperCase());
    }


}

@FunctionalInterface
interface Printable{
    void print(String s);
}


class T2{
    /**
     * 通过对象名引用成员方法
     * 使用前提是对象名已经存在的,成员方法也是存在的
     * 就可以使用对象名来引用成员方法
     */
    //定义一个方法,方法的参数传递printable接口
    public static void printString(Printable p){
        p.print("hello");
    }

    public static void main(String[] args) {
        //调用printString方法方法的参数Printable是一个函数式接口,所以可以传递Lambda表达式
        printString(s -> {
            T1 t1 = new T1();

            t1.printUpperCaseString(s);
        });
    }
}
posted @ 2022-07-21 16:13  我滴妈老弟  阅读(47)  评论(0编辑  收藏  举报