1. 程式人生 > 程式設計 >JDK都出到14了,你有什麼理由不會函數語言程式設計(推薦)

JDK都出到14了,你有什麼理由不會函數語言程式設計(推薦)

函式式介面

先看一下官方定義

Functional interfaces provide target types for lambda expressions and method references.

可以看出函式式介面主要用於lambda表示式,這類介面只定義了唯一的抽象方法的介面(除了隱含的Object物件的公共方法),一開始也稱SAM型別介面(Single Abstract Method)。

簡單使用

List<Integer> list = Lists.newArrayList(1,2,3);
    list.forEach(r -> {
      System.out.println("re = " + Math.sqrt(r));
    });

看一下 foreach 實現,在Iterable.java

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
      action.accept(t);
    }
  }

這裡出現的Consumer就是一個函式式介面, java8 提供了一些常用的函式式介面

  1. Predicate -- 傳入一個引數,返回一個bool結果, 方法為boolean test(T t)
  2. Consumer -- 傳入一個引數,無返回值,純消費。 方法為void accept(T t)
  3. Function -- 傳入一個引數,返回一個結果,方法為R apply(T t)
  4. Supplier -- 無引數傳入,返回一個結果,方法為T get()
  5. UnaryOperator -- 一元操作符, 繼承Function,傳入引數的型別和返回型別相同。
  6. BinaryOperator -- 二元操作符, 傳入的兩個引數的型別和返回型別相同, 繼承BiFunction

這裡就不一一列舉了,具體請見 java.util.function 包 都很簡單,不太清楚的自行google

擴充套件

但是jdk提供的有時候不一定能滿足需求,這個時候就需要我們自定義函式式介面

1.普通的 Function 或者 Consumer 只能就收一個引數,BiFuntion 和 BiConsumer 也只能接受連個引數,引數更多的情況就無法滿足了

以 consumer 為例,先自定義一個介面

@FunctionalInterface
  public interface TriConsumer<T,U,W> {
    void accept(T t,U u,W w);

    default TriConsumer<T,W> andThen(TriConsumer<? super T,? super U,? super W> after) {
      Objects.requireNonNull(after);

      return (l,r,w) -> {
        accept(l,w);
        after.accept(l,w);
      };
    }
  }

函式式介面一般使用 @FunctionalInterface 註解註釋,以申明該介面是一個函式式介面, 這裡提供一個 andThen 方法以支援連續呼叫

使用方法

TriConsumer<Integer,Integer,Integer> consumer = (a,b,c) -> {
      System.out.println(a + b + c);
    };
    consumer.accept(5,6,7);

funtion類似,這裡就不舉例了

2.異常捕獲

FunctionalInterface 提供的介面一般是不丟擲異常的,意味著我們在使用的時候需要在方法體內部捕獲異常,這裡定義一種可以丟擲異常的介面

@FunctionalInterface
  public interface InterfaceException<T> {
    void apply(T t) throws Exception;
  }

總結

到此這篇關於JDK都出到14了,你有什麼理由不會函數語言程式設計(推薦)的文章就介紹到這了,更多相關jdk 函數語言程式設計內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!