Java 靜態(tài)方法引用

2018-03-18 16:56 更新

Java Lambda - Java靜態(tài)方法引用


lambda表達(dá)式表示在函數(shù)接口中定義的匿名函數(shù)。

方法引用使用現(xiàn)有方法創(chuàng)建lambda表達(dá)式。

方法引用的一般語法是

Qualifier::MethodName

兩個(gè)連續(xù)的冒號(hào)充當(dāng)分隔符。

MethodName 是方法的名稱。

限定符告訴在哪里找到方法引用。

例子

例如,我們可以使用 String::length String 類引用length方法。這里 String 是限定符, length 是方法名。

我們只需要指定方法名。

無需指定方法的參數(shù)類型和返回類型。

方法引用的目標(biāo)類型是功能接口。它確定方法的簽名并在必要時(shí)解析重載的方法。


方法引用類型

有六種類型的方法引用。

  • TypeName::staticMethod - 引用類的靜態(tài)方法,接口或枚舉
  • objectRef::instanceMethod - 引用實(shí)例方法
  • ClassName::instanceMethod - 從類中引用實(shí)例方法
  • TypeName.super::instanceMethod - 從對(duì)象的父類型引用實(shí)例方法
  • ClassName::new - 引用一個(gè)類的構(gòu)造函數(shù)
  • ArrayTypeName::new - 對(duì)指定數(shù)組類型的構(gòu)造函數(shù)的引用

靜態(tài)方法引用

靜態(tài)方法引用允許我們使用靜態(tài)方法作為lambda表達(dá)式。

靜態(tài)方法可以在類,接口或枚舉中定義。

以下代碼定義了兩個(gè)lambda表達(dá)式。

第一個(gè)lambda表達(dá)式func1是通過定義輸入?yún)?shù)x并提供lambda表達(dá)式主體來創(chuàng)建的?;旧希@是創(chuàng)建lambda表達(dá)式的正常方式。

第二個(gè)lambda表達(dá)式func2是通過從Integer類引用靜態(tài)方法創(chuàng)建的。

import java.util.function.Function;

public class Main {
  public static void main(String[] argv) {
    // Using  a  lambda  expression
    Function<Integer, String> func1  = x -> Integer.toBinaryString(x);
    System.out.println(func1.apply(10));

    // Using  a  method  reference
    Function<Integer, String> func2  = Integer::toBinaryString;
    System.out.println(func2.apply(10));
  }  
}

從Integer類的靜態(tài)方法的簽名如下。

static String toBinaryString(int i)

上面的代碼生成以下結(jié)果。

例2

以下代碼顯示了如何使用Integer.sum作為lambda表達(dá)式。

import java.util.function.BiFunction;

public class Main {
  public static void main(String[] argv) {

    // Uses a lambda expression
    BiFunction<Integer, Integer, Integer> func1 = (x, y) -> Integer.sum(x, y);
    System.out.println(func1.apply(2, 3));

    // Uses a method reference
    BiFunction<Integer, Integer, Integer> func2 = Integer::sum;
    System.out.println(func2.apply(2, 3));

  }
}

上面的代碼生成以下結(jié)果。

重載中的靜態(tài)方法引用

我們可以在靜態(tài)方法引用中使用重載的靜態(tài)方法。

當(dāng)重載方法時(shí),我們必須更加注意方法簽名和相應(yīng)的函數(shù)接口。

在下面的列表中,我們有來自Integer類的三個(gè)版本的valueOf()。

static Integer valueOf(int i)
static Integer  valueOf(String s)
static Integer  valueOf(String s, int radix)

以下代碼顯示了如何使用不同的目標(biāo)函數(shù)接口與重載的Integer.valueOf()靜態(tài)方法。

import java.util.function.BiFunction;
import java.util.function.Function;

public class Main{
  public static void main(String[] argv){
    // Uses  Integer.valueOf(int)
    Function<Integer, Integer> func1  = Integer::valueOf;

    // Uses  Integer.valueOf(String)
    Function<String, Integer> func2  = Integer::valueOf;

    // Uses  Integer.valueOf(String, int)
    BiFunction<String, Integer,  Integer> func3  = Integer::valueOf;

    System.out.println(func1.apply(7)); 
    System.out.println(func2.apply("7")); 
    System.out.println(func3.apply("101010101010", 2));
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)