1. 程式人生 > >Java 8之方法引用(Method References)

Java 8之方法引用(Method References)

Java 8中方法也是一種物件,可以By名字來引用。不過方法引用的唯一用途是支援Lambda的簡寫,使用方法名稱來表示Lambda。不能通過方法引用來獲得諸如方法簽名的相關資訊。

方法引用的分類

方法引用分為4類,常用的是前兩種。方法引用也受到訪問控制權限的限制,可以通過在引用位置是否能夠呼叫被引用方法來判斷。具體分類資訊如下:

  • 引用靜態方法
    ContainingClass::staticMethodName
    例子: String::valueOf,對應的Lambda:(s) -> String.valueOf(s)
    比較容易理解,和靜態方法呼叫相比,只是把.換為::

  • 引用特定物件的例項方法


    containingObject::instanceMethodName
    例子: x::toString,對應的Lambda:() -> this.toString()
    與引用靜態方法相比,都換為例項的而已

  • 引用特定型別的任意物件的例項方法
    ContainingType::methodName
    例子: String::toString,對應的Lambda:(s) -> s.toString()
    太難以理解了。難以理解的東西,也難以維護。建議還是不要用該種方法引用。
    例項方法要通過物件來呼叫,方法引用對應Lambda,Lambda的第一個引數會成為呼叫例項方法的物件。

  • 引用建構函式
    ClassName::new
    例子: String::new,對應的Lambda:() -> new String()
    建構函式本質上是靜態方法,只是方法名字比較特殊。

方法引用的例子

public class MethodReference {
    public static void main(String[] args) {
        // 方法引用::引用建構函式
        PersonFactory factory = new PersonFactory(Person::new);

        List<Person> personList = new ArrayList<Person>();

        Person p1 = factory.getPerson();
        p1.setName("Kobe");
        personList.add(p1);
        Person p2 = factory.getPerson();
        p2.setName("James");
        personList.add(p2);
        Person p3 = factory.getPerson();
        p3.setName("Paul");
        personList.add(p3);

        Person[] persons1 = personList.toArray(new Person[personList.size()]);
        System.out.print("排序前: ");
        printArray(persons1);

        // 方法引用::引用靜態方法
        Arrays.sort(persons1, MethodReference::myCompare);
        System.out.print("排序後: ");
        printArray(persons1);
        System.out.println();

        Person[] persons2 = personList.toArray(new Person[personList.size()]);
        System.out.print("排序前: ");
        printArray(persons2);

        // 方法引用::用特定物件的例項方法
        Arrays.sort(persons2, p1::compare);
        System.out.print("排序後: ");
        printArray(persons2);
        System.out.println();

        Person[] persons3 = personList.toArray(new Person[personList.size()]);
        System.out.print("排序前: ");
        printArray(persons3);

        // 方法引用::引用特定型別的任意物件的例項方法
        Arrays.sort(persons3, Person::compareTo);
        System.out.print("排序後: ");
        printArray(persons3);
    }

    public static void printArray(Person[] persons) {
        for (Person p : persons) {
            System.out.print(p.name + "  ");
        }
        System.out.println();
    }

    public static int myCompare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }

    static class Person {
        private String name;

        public Person() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int compare(Person p1, Person p2) {
            return p1.getName().compareTo(p2.getName());
        }

        public int compareTo(Person p) {
            return this.getName().compareTo(p.getName());
        }
    }

    static class PersonFactory {
        private Supplier<Person> supplier;

        public PersonFactory(Supplier<Person> supplier) {
            this.supplier = supplier;
        }

        public Person getPerson() {
            return supplier.get();
        }
    }
}

結語

方法引用僅僅是Lambda的配套服務,主要目的是通過名字來獲得Lambda,重複利用已有的方法。

相關推薦

Java 8方法引用(Method References)

Java 8中方法也是一種物件,可以By名字來引用。不過方法引用的唯一用途是支援Lambda的簡寫,使用方法名稱來表示Lambda。不能通過方法引用來獲得諸如方法簽名的相關資訊。 方法引用的分類 方法引用分為4類,常用的是前兩種。方法引用也受到訪問控制權限的

淺談Java 8中的方法引用(Method References)

  本人接觸Java 8的時間不長,對Java 8的一些新特性略有所知。Java 8引入了一些新的程式設計概念,比如經常用到的 lambda表示式、Stream、Optional以及Function等,讓人耳目一新。這些功能其實上手並不是很難,根據別人的程式碼抄過來改一下,並不要知道內部的實現原理,也可以很熟

java方法引用(Method References)

java世界的變化有點大,java8之後大家都在寫lambdas表示式,感覺方法引用也是為了支援這一特點吧(當然也看到一些人人說沒什麼用)。 看到這麼一段程式碼,是不是很清晰地解釋了了不同寫法的區別。 可以看到使用雙冒號(::)將例項引用或類名與方法分開。 Iterable介面的foreash方法傳入C

Java 8 新特性:Lambda 表示式方法引用(Lambda 表示式補充版)

方法引用 文 | 莫若吻      (注:此文乃個人查詢資料然後學習總結的,若有不對的地方,請大家指出,非常感謝!) 1.方法引用簡述 方法引用是用來直接訪問類或者例項的已經存在的方法或

Java 8 Lambda表達式方法引用 ::雙冒號操作符

ont tag shm 表達 類型 beta add nta collected 雙冒號運算符就是java中的方法引用,方法引用的格式是類名::方法名。 這裏只是方法名,方法名的後面沒有括號“()”。--------> 這樣的式子並不代表一定會調用這個

java 8新特性方法引用

方法引用通過方法的名字來指向一個方法。 方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。 方法引用使用一對冒號 :: 。 下面,我們在 Car 類中定義了 4 個方法作為例子來區分 Java 中 4 種不同方法的引用。 public class Car {

lambda表示式方法引用----java

1.概念 ---- 什麼是方法引用???     對於每一個java類來說,它們都主要有三種方法,即普通方法、靜態方法和構造方法。而方法引用就是利用函式式介面+lambda表示式(這裡的lambda表示式並非前面提到的帶"->“符號的表示式,而是使用雙冒號”::

java知識方法的練習及註意事項

Java知識1.1 方法的練習 1.1.1 方法練習之獲取兩個數據中的較大 1.1.2 案例代碼四 package com.itheima_01; import java.util.Scanner; /* * 需求:鍵盤錄入兩個數據,返回兩個數中的較大值 * * 兩

Java四種方法引用

方法引用是lambda表示式的一種特殊形式,如果正好有某個方法滿足一個lambda表示式的形式,那就可以將這個lambda表示式用方法引用的方式表示,但是如果這個lambda表示式的比較複雜就不能用方法引用進行替換。實際上方法引用是lambda表示式的一種語法糖。在介紹方法引用使用方式之前,先將方法

Java8新特性整理方法引用

Java8新特性整理之方法引用 方法引用語法 目標引用 ::方法的名稱 1 例子 擷取字串的Lambda表示式 (str, i) -> str.substring(i) 1 等效的方法引用 String::substring

Java基礎方法過載(Overload)

同一個類中的多個方法可以有相同的方法名稱,但是有不同的引數列表,這就稱為方法過載(method overloading)。 過載(overloading) 是在一個類裡面,方法名字相同,而引數不同。返回型別可以相同也可以不同。 每個過載的方法(或者建構函式)都必須有一個獨一無二的引數型別

Java 8 原理篇

1. Lambda實現原理 1.1 例項解析 先從一個例子開始 public class LambdaTest { public static void print(String name, Print print){ print.print(name); }

Java 8 實戰篇

1. Function JDK 1.8 API包含了很多內建的函式式介面,比如在老Java中常用到的Comparator或者Runnable介面,這些介面都增加了@FunctionalInterface註解以便能用在lambda上。Java8中java.util.function包下

Java 8 基礎篇

1. lambda表示式 從java8出現以來lambda,也可稱為閉包(closure),是最重要的特性之一,它可以讓我們用簡潔流暢的程式碼完成一個功能。 很長一段時間java被吐槽是冗餘和缺乏函數語言程式設計能力的語言,隨著函數語言程式設計的流行java8種也引入了這種程式設計風

Java基礎方法過載與構造方法

Java中方法的過載與構造方法 1. 方法的過載 過載是指在同一個類內具有相同名稱的多個方法,這些同名方法如果引數個數不同,或者引數個數相同,但型別不同,則這些同名的方法就具有不同的功能。 注意:方法的過載中引數的型別是關鍵,僅僅是引數的變數名不同是不行的。也就是說,引數的列表必須不

java筆記方法

   一、那麼什麼是方法呢? 所謂方法,就是用來解決一類問題的程式碼的有序組合,是一個功能模組 方法是解決一類問題的步驟的有序組合 方法包含於類或物件中 方法在程式中被建立,在其他地方被引用 二、方法的優點 1. 使程式變得更簡短而清晰。 2. 有利於程式維護。 3.

Java 8數值流使用和構建流的方式

數值流: 數值流,顧名思義就是專門用來操作基礎資料型別的流,那它的作用是什麼呢?先看下面的程式碼。這段程式碼是獲取集合每個物件的num欄位的值,然後求所和。得出的結果是15,看上去沒有問題,但是要注意的是流在進行求和操作的時候從物件中取出來的是基本型別,會進行裝箱操

JAVA8新特性方法引用與構造器引用

一:簡介        1:什麼是方法引用?                    若Lambda體中的功能,已經有方法提供了實現,可以使用方法引用。                    可以將方法引用理解為Lambda表示式的另一種表現形式。        2:方法

Android 技能圖譜學習路線系列-Java基礎方法鎖、物件鎖、類鎖

先了解一下Synchronized的用法。 一、Synchronized的用法 在修飾程式碼塊的時候需要一個reference物件作為鎖的物件。 在修飾方法的時候預設是當前物件作為鎖的物件。 在修飾類時候預設是當前類的Class物件作為鎖的物件。 二、三種鎖得區

java 8Lambda 五種語法格式

語法格式一:無參、無返回值,lambda體只需一條語句 Runnable r1 =() -> System.out.print("hello"); 以往程式碼如下: Runnable runnable = new Runnable() { @Overrid