1. 程式人生 > >JAVA8新特性(三)——方法引用

JAVA8新特性(三)——方法引用

我們之前寫Lambda表示式,如果Lambda表示式有對應方法,我們可以直接引用方法作為Lambda表示式。這種做法叫做方法引用。方法引用用”::”分隔。

例子

@Test
public void methodRefTest() {
    MethodReference.Class1 class1 = new MethodReference.Class1();
    double result = doubleUnatuOperator(4.5, class1::return1);
    System.out.println("result:" + result);
}

public double doubleUnatuOperator(double num, DoubleUnaryOperator doubleUnaryOperator) {
    return doubleUnaryOperator.applyAsDouble(num);
}
static class Class1 {

    public double return1(double i) {
        return 1 + i;
    }

}

這裡doubleSupplier的表示式呼叫Class1.return1方法,就可以使用方法引用。

方法引用有四種

引用靜態方法

ContainingClass::staticMethodName

例子: String::valueOf,對應的Lambda:(s) -> String.valueOf(s)

比較容易理解,和靜態方法呼叫相比,只是把.換為::

引用特定物件的例項方法

containingObject::instanceMethodName

例子: x::toString,對應的Lambda:() -> this.toString()

與引用靜態方法相比,都換為例項的而已

引用建構函式

ClassName::new

例子: String::new,對應的Lambda:() -> new String()

建構函式本質上是靜態方法,只是方法名字比較特殊。

引用特定型別的任意物件的例項方法

這個不清楚

例子

public class MethodReference {

    @Test
    public void staticMethodRefTest() {
        double result = doubleUnatuOperator(4.5, Class1::staticReturn1);
        System.out.println("result:" + result);
    }

    @Test
    public void methodRefTest() {
        MethodReference.Class1 class1 = new MethodReference.Class1();
        double result = doubleUnatuOperator(4.5, class1::return1);
        System.out.println("result:" + result);
    }

    @Test
    public void constructorRefTest() {
        Class1 class1 = supplier(Class1::new);
        System.out.println(class1);
    }

    @Test
    public void ContainingTypeRefTest() {
        String[] stringArray = {"Barbara", "James", "Mary", "John",
                "Patricia", "Robert", "Michael", "Linda"};
        Arrays.sort(stringArray, (a, b) -> {
            return a.compareToIgnoreCase(b);
        });
        System.out.println(Arrays.toString(stringArray));
        Arrays.sort(stringArray, String::compareToIgnoreCase);
        System.out.println(Arrays.toString(stringArray));
        
    }

    public static double doubleUnatuOperator(double num, DoubleUnaryOperator doubleUnaryOperator) {
        return doubleUnaryOperator.applyAsDouble(num);
    }

    public Object unaryOperator(Object t,UnaryOperator<Object> operator) {
        return operator.apply(t);
    }

    public Class1 supplier(Supplier<Class1> supplier) {
        return supplier.get();
    }


    static class Class1 {

        private String name;

        public String getName() {
            return name;
        }

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

        public Class1() {

        }

        public Class1(String name) {
            System.out.println(name + "構造成功");
        }

        public double return1(double i) {
            return 1 + i;
        }

        public static double staticReturn1(double i) {
            return i + 1;
        }

        public double add(Class1 a) {
            return 12.0;
        }

        @Override
        public String toString() {
            return "Class1{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
}

相關推薦

JAVA8特性()——方法引用

我們之前寫Lambda表示式,如果Lambda表示式有對應方法,我們可以直接引用方法作為Lambda表示式。這種做法叫做方法引用。方法引用用”::”分隔。 例子 @Test public void methodRefTest() { MethodReference.

2020了你還不會Java8特性方法引用詳解及Stream 流介紹和操作方式詳解(

方法引用詳解 方法引用: method reference 方法引用實際上是Lambda表示式的一種語法糖 我們可以將方法引用看作是一個「函式指標」,function pointer 方法引用共分為4類: 類名::靜態方法名 引用名(物件名)::例項方法名 類名::例項方法名 (比較不好理解,個地方呼叫的方

java8 特性方法引用(::)

java8中的方法引用(雙冒號)::是類似於C++的域運算子,獲取方法使用的。 使用場景:cars.forEach( Car::repair ); 1、構造方法引用(Class::new):       相當於建立物件;如果函式式介面方法有引數,會匹配具體有

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

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

java8特性方法引用、構造器引用

前言: 接上一篇文章:Java8新特性(內建的核心函式式介面)http://blog.csdn.net/xinghuo0007/article/details/78603908 我們知道使用了L

Java8特性方法引用

# 一 前言 日常開發中,經常使用到Lambda表示式,例如: ```java public static void main(String[] args) { List list = Arrays.asList(1, 5, 10, 4, 2); // 列印列表中的每一個數字 li

java8特性-預設方法

作為一個java程式猿,經常會被問基礎怎麼樣,對於這個問題,我理解的有兩方面:一是對於java基礎的理解和掌握,比如JDK的相關特性;二是工作的經歷,畢竟,語言程式設計是一門實戰性質的藝術,就算掌握了千萬理論,編寫不出實際的程式碼,等於扯淡。而且,隨著技術的革新,很多東西都不再是一成不變的,還記得剛出校門那會

JDK8特性04 方法引用與構造器引用

def 形式 com 理解 nts hello 數列 getname println import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /**

java 8特性方法引用

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

Java8 特性() - 日期時間物件以及一些其他特性

日期時間物件 關於日期時間的操作可以分為兩種: 轉換:與字串的互相轉換,與時間戳的互相轉換 計算:計算兩個時間點之間的間隔、時間點與時間段的計算(計算下週N、下個月D日、去年M月D日等等) Java8 提供了三個類:LocalDate、LocalTime、LocalDateTime,它們的形式如 2020

Java8特性方法引用、構造器引用、陣列引用

目錄: 1、方法引用 1.1、物件 :: 例項方法 1.2、類 :: 靜態方法 1.3、類 ::例項方法 2、構造器引用 2.1、介紹 2.2、使用 3、陣列引用 3.1、介紹 3.2、使用 1、方法引用 若lambda體中的內容有方法已經實現了,

java8特性-方法引用

show acc 函數式 類名 抽象方法 bip pub 構造 -- 方法引用:若 Lambda 體中的功能,已經有方法提供了實現,可以使用方法引用 (可以將方法引用理解為 Lambda 表達式的另外一種表現形式) 1. 對象的引用 :: 實例方法名2. 類

Java8特性整理之方法引用

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

JAVA8特性-Lambda表示式、函式式介面以及方法引用

  一、Lembda表示式 關於Lambda表示式,首先我們要知道Lambda表示式是什麼?為什麼要用?在什麼情況下要用? what:Lambda 是一個匿名函式,我們可以把 Lambda 表示式理解為是一段可以傳遞的程式碼(將程式碼 像資料一樣進行傳遞)。 why:可以寫

Java8特性(二)方法引用

方法引用 方法引用其實就是Lambda表示式的簡寫,標誌是 :: 1、和Lambda表示式比較 public class Java8Test { public s

Java8特性整理之方法引用(二)

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

JAVA8特性--方法引用

方法引用是什麼? w3c教程上這樣解釋:方法引用通過方法的名字來指向一個方法。反正這句話我是看不明白啥意思,結合下面的要介紹的例子我認為這樣解釋更通俗易懂(瞭解方法引用前,建議先了解下Lambda表示式,請戳:Lambda表示式):方法引用就是一個特殊的Lam

Java8特性之二:方法引用

輸出結果 知識 public ava urn strong class rules ros   上一節介紹了Java8新特性中的Lambda表達式,本小節繼續講解Java8的新特性之二:方法引用。方法引用其實也離不開Lambda表達式。 1、方法引用的使用場景   我們

Java8特性:接口的默認方法與接口的靜態方法

err 類比 urn 多態 class 數組保存 統一 body bstr 接口的定義 接口的作用是定義該類型的實例要具有的功能,也就是必須執行哪些工作,並且不需要關心這些工作是怎麽具體進行的。接口定義的方法沒有方法體,並且接口不允許定義實例變量。如果一個類實現了這個接口就

JDK8特性方法引用

技術分享 main 圖片 new cto ger ons alt 標識 引用方法並運行 在Java中,方法和構造方法都看作是對象的一種,那麽你要引用它(不是調用),則可以用::來引用。用來存儲這個引用的類型用@FunctionlaInterface註解來標識。 示例: p