JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程(推薦)
函數(shù)式接口
先看一下官方定義
Functional interfaces provide target types for lambda expressions and method references.
可以看出函數(shù)式接口主要用于lambda表達(dá)式,這類(lèi)接口只定義了唯一的抽象方法的接口(除了隱含的Object對(duì)象的公共方法),一開(kāi)始也稱SAM類(lèi)型接口(Single Abstract Method)。
簡(jiǎn)單使用
List<Integer> list = Lists.newArrayList(1,2,3); list.forEach(r -> { System.out.println("re = " + Math.sqrt(r)); });
看一下 foreach
實(shí)現(xiàn),在Iterable.java
中
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
這里出現(xiàn)的Consumer
就是一個(gè)函數(shù)式接口, java8 提供了一些常用的函數(shù)式接口
- Predicate -- 傳入一個(gè)參數(shù),返回一個(gè)bool結(jié)果, 方法為
boolean test(T t)
- Consumer -- 傳入一個(gè)參數(shù),無(wú)返回值,純消費(fèi)。 方法為
void accept(T t)
- Function -- 傳入一個(gè)參數(shù),返回一個(gè)結(jié)果,方法為
R apply(T t)
- Supplier -- 無(wú)參數(shù)傳入,返回一個(gè)結(jié)果,方法為
T get()
- UnaryOperator -- 一元操作符, 繼承Function,傳入?yún)?shù)的類(lèi)型和返回類(lèi)型相同。
- BinaryOperator -- 二元操作符, 傳入的兩個(gè)參數(shù)的類(lèi)型和返回類(lèi)型相同, 繼承BiFunction
這里就不一一列舉了,具體請(qǐng)見(jiàn) java.util.function 包 都很簡(jiǎn)單,不太清楚的自行g(shù)oogle
擴(kuò)展
但是jdk提供的有時(shí)候不一定能滿足需求,這個(gè)時(shí)候就需要我們自定義函數(shù)式接口
1.普通的 Function 或者 Consumer 只能就收一個(gè)參數(shù),BiFuntion 和 BiConsumer 也只能接受連個(gè)參數(shù),參數(shù)更多的情況就無(wú)法滿足了
以 consumer 為例,先自定義一個(gè)接口
@FunctionalInterface public interface TriConsumer<T, U, W> { void accept(T t, U u, W w); default TriConsumer<T, U, W> andThen(TriConsumer<? super T, ? super U, ? super W> after) { Objects.requireNonNull(after); return (l, r, w) -> { accept(l, r, w); after.accept(l, r, w); }; } }
函數(shù)式接口一般使用 @FunctionalInterface 注解注釋?zhuān)陨昝髟摻涌谑且粋€(gè)函數(shù)式接口, 這里提供一個(gè) andThen 方法以支持連續(xù)調(diào)用
使用方法
TriConsumer<Integer, Integer, Integer> consumer = (a, b, c) -> { System.out.println(a + b + c); }; consumer.accept(5,6,7);
funtion類(lèi)似,這里就不舉例了
2.異常捕獲
FunctionalInterface 提供的接口一般是不拋出異常的,意味著我們?cè)谑褂玫臅r(shí)候需要在方法體內(nèi)部捕獲異常,這里定義一種可以拋出異常的接口
@FunctionalInterface public interface InterfaceException<T> { void apply(T t) throws Exception; }
總結(jié)
到此這篇關(guān)于JDK都出到14了,你有什么理由不會(huì)函數(shù)式編程(推薦)的文章就介紹到這了,更多相關(guān)jdk 函數(shù)式編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解
這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03java:try...catch跳過(guò)異常繼續(xù)處理循環(huán)問(wèn)題
這篇文章主要介紹了java:try...catch跳過(guò)異常繼續(xù)處理循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案
在本篇文章里小編給大家整理了關(guān)于解決springboot 連接 mysql 時(shí)報(bào)錯(cuò) using password: NO的方案,有需要的朋友們可以學(xué)習(xí)下。2020-01-01java調(diào)用未知類(lèi)的指定方法簡(jiǎn)單實(shí)例
這篇文章介紹了java調(diào)用未知類(lèi)的指定方法簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-09-09Spring MVC注解式開(kāi)發(fā)示例完整過(guò)程
這篇文章主要介紹了Spring MVC注解式開(kāi)發(fā)示例完整過(guò)程,MVC注解式開(kāi)發(fā)即處理器基于注解的類(lèi)開(kāi)發(fā),對(duì)于每一個(gè)定義的處理器,無(wú)需在xml中注冊(cè),只需在代碼中通過(guò)對(duì)類(lèi)與方法的注解,即可完成注冊(cè)2023-02-02