最近在讀 Clean Architecture 無瑕的程式碼,讀到第六個章節就覺得自己在 Java 的函數式設計不夠熟悉(函數介面),就整理了一下基本應用,希望之後可以應用到底層架構中。
# 實作 Comparator
Comparator comparator = (o1, o2) -> 0;
# 用 default method (返回與當前比較器相反的比較器)
Comparator reversed = comparator.reversed();
雖然可以自己定義函數介面,不過 Java 已經有先定義了幾個通用函數介面,需要時可以先考慮通用的,再決定要不要自訂通用函數介面。
接受一個引數,處理後不回傳值,就可以使用 Consumer 介面。 因為接受引數但沒有回傳值,等於是消耗了引數,引此叫做 Consumer (這樣很好記)
// Iterable 介面的 forEach 就有用到
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
List<String> list = List.of("This", "is", "functional", "service");
list.forEach(x -> System.out.println(String.join(" ", list)));
另外還有像是 IntConsumer、LongConsumer等等,使用上都一樣。
接受一個引數,處理後回傳計算的結果,就可以使用 Function 介面,因為就像是 y=f(x) 這樣的數學函式,所以就叫做 Function。
// stream 的 map 就有使用到
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
和 Consumer 一樣也有 IntFunction、LongFunction 等等。