1. 程式人生 > 其它 >4.方法引用和構造器引用

4.方法引用和構造器引用

1.方法引用:若lamada體中的函式體已經有方法實現了,我們可以使用"方法引用"
    可以理解為方法引用為lamada表示式的另外一種表示

    主要有三種語法結構:
        1.1 
            物件::示例方法名
        1.2
            類::靜態方法名
        1.3
            類::示例方法名


   
1.1物件::示例方法名
    案例:
        1.直接使用簡單的核心函式式介面
            Consumer<String> consumer = (x) -> System.out.println(x);
            consumer.accept("你好lamada"); 
        2.升級:如果函式式介面中的方法引數列表和物件方法的引數列表和返回值一致時,可以使用以下
            //物件函式(PrintStream)的引數列表和返回值型別必須和函式Consumer的引數列表和返回值型別一致
            重點1:如PrintStream物件中的println方法的引數列表和返回值型別和Consumer函式式介面的方法引數列表和返回值一致,可以使用以下
            PrintStream ps = System.out;
            Consumer<String> consumer1 = ps::println;
            consumer1.accept("你好Consumer1");
3.第三種方式:lamada體中使用外部物件呼叫方法的形式
            PrintStream ps = System.out;
            Consumer<String> consumer2 = (x) -> ps.println(x);
            consumer2.accept("你好Consumer2");
        
4.優化方式:System.out就是PrintStream物件
            Consumer<String> consumer3=System.out::println;
            consumer3.accept("consumer3");

類::靜態方法名

樣例如下:進行兩個數比較大小
    /*
        測試lamada方法呼叫:
        類::方法名  Integer.compare為Integer的靜態方法
     */
    @Test
    public void test9() {
        //重點1.第一種方式:使用平常的lamada表示式,發小compare為Integer的靜態方法,所以可以升級為第二種方式
         Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
        int compare = com.compare(2, 3);
        System.out.println("第一種情況:" + compare);
        //2.第二種方式:直接使用類::靜態方法的形式進行呼叫,但是此種方法的前提條件是
            1.函式式介面(Comparator)的方法入參和lamada體中類的方法(Integer.compareTo)入參一致
            2.函式式介面(Comparator)的返回值型別和lamada體中類的方法(Integer.compareTo)返回值型別一致
        Comparator<Integer> com1 = Integer::compareTo;
        int compare1 = com1.compare(2, 3);
        System.out.println("第二種情況:" + compare1);

類名::方法名

/*
    類名::方法名
    1.lambda 體中呼叫方法的引數列表和返回值型別。要與函式式介面的抽象方法的函式式列表和返回值型別保持一致
    2.若lambda引數列表中的第一個引數是例項方法的呼叫者,而第二個引數是例項方法的引數,可以使用ClassName:: method
    如:(x,y) -> x.equals(y)
 */
@Test
public void test10() {
    BiPredicate<String, String> bp = (x, y) -> x.equals(y);
    boolean test = bp.test("你好", "你好");
    System.out.println(test);

    BiPredicate<String, String> bp1 = String::equals;
    boolean test1 = bp1.test("你好1", "你好1");
    System.out.println(test1);
}