Java的函數式接口簡介

所謂函數式接口,指的是隻有一個抽象方法的接口。

函數式接口可以被隱式轉換爲Lambda表達式。

函數式接口可以用@FunctionalInterface註解標識。

 

JDK1.8之前就出現了一些符合函數式接口定義的接口:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

 

JDK1.8之後,又添加了一組函數式接口:

java.util.function.*

這個路徑下有一大堆接口,都是函數式接口,代表了接口調用的各種不同應用場景。

另外,在JDK1.8開始,之前就有的函數式接口(比如Runnable接口)也都添加了@FunctionalInterface註解。

 

下面舉幾個java.util.function下的函數式接口的例子。

1,Consumer<T>

接口唯一的抽象方法是:

void accept(T t);

這是一個單參數,無返回值的方法,參數是泛型類。這個接口被稱爲消費型接口,因爲沒有返回值,接口裏面幹了什麼和調用方沒什麼關係。

這種單參數無返回值的接口我們可以這麼用Lambda表達式:

import java.util.function.Consumer;

public class Test {
    public static void main(String[] args) {
        Consumer consumer = (a) -> System.out.println("this is " + a);
        consumer.accept("123");
    }
}

輸出的結果是:

this is 123

 

2,Supplier<T>

接口唯一的抽象方法是:

T get();

這是一個無參數,有返回值的方法,返回值類型是泛型類。這個接口被稱作供給型接口。

這種無參數有返回值的方法我們可以這麼用:

import java.util.function.Supplier;

public class Test {
    public static void main(String[] args) {
        Supplier<String> supplier = () -> "abc";
        String result = supplier.get();
        System.out.println(result);
    }
}

 

3,ToIntFunction<T>

接口唯一的抽象方法是:

int applyAsInt(T value);

這是一個單參數,返回值爲int的方法,參數類型是泛型類。

使用例子:

import java.util.function.ToIntFunction;

public class Test {
    public static void main(String[] args) {
        ToIntFunction<String> toIntFunction = (a) -> {
            return Integer.parseInt(a);
        };
        int result = toIntFunction.applyAsInt("123");
        System.out.println(result);
    }
}

 

關於@FunctionalInterface註解

@FunctionalInterface註解是對函數式接口的標識,他的作用是對接口進行編譯級別的檢查,如果一個接口使用了這個註解,但是寫了兩個抽象方法,會出現編譯錯誤。

 

以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章