JDK8新特性-java.util.function-Function接口使用
JDK8新特性-java.util.function-Function接口
14年,Oracle公司如期發(fā)布了Java 8正式版?,F(xiàn)如今4年過去了,終于鼓起勇氣認(rèn)真對(duì)待它,就好似雖然認(rèn)識(shí)了好幾年的伙伴,突然感覺要成為情侶的感覺……
JDK 1.8 API包含了很多內(nèi)建的函數(shù)式接口,在老Java中常用到的比如Comparator或者Runnable接口,這些接口都增加了@FunctionalInterface注解以便能用在lambda上。
現(xiàn)如今,我們則從Function常用函數(shù)入口,真正了解一下。
name | type | description |
---|---|---|
Consumer | Consumer< T > | 接收T對(duì)象,不返回值 |
Predicate | Predicate< T > | 接收T對(duì)象并返回boolean |
Function | Function< T, R > | 接收T對(duì)象,返回R對(duì)象 |
Supplier | Supplier< T > | 提供T對(duì)象(例如工廠),不接收值 |
UnaryOperator | UnaryOperator | 接收T對(duì)象,返回T對(duì)象 |
BinaryOperator | BinaryOperator | 接收兩個(gè)T對(duì)象,返回T對(duì)象 |
標(biāo)注為FunctionalInterface的接口被稱為函數(shù)式接口,該接口只能有一個(gè)自定義方法,但是可以包括從object類繼承而來的方法。
如果一個(gè)接口只有一個(gè)方法,則編譯器會(huì)認(rèn)為這就是一個(gè)函數(shù)式接口。
是否是一個(gè)函數(shù)式接口,需要注意的有以下幾點(diǎn):
- 該注解只能標(biāo)記在”有且僅有一個(gè)抽象方法”的接口上。
- JDK8接口中的靜態(tài)方法和默認(rèn)方法,都不算是抽象方法。
- 接口默認(rèn)繼承java.lang.Object,所以如果接口顯示聲明覆蓋了Object中方法,那么也不算抽象方法。
- 該注解不是必須的,如果一個(gè)接口符合”函數(shù)式接口”定義,那么加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進(jìn)行檢查。如果編寫的不是函數(shù)式接口,但是加上了@FunctionInterface,那么編譯器會(huì)報(bào)錯(cuò)。
- 在一個(gè)接口中定義兩個(gè)自定義的方法,就會(huì)產(chǎn)生Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface錯(cuò)誤.
Function常用方法&&實(shí)踐
//將Function對(duì)象應(yīng)用到輸入的參數(shù)上,然后返回計(jì)算結(jié)果。 R apply(T t);
//返回一個(gè)先執(zhí)行當(dāng)前函數(shù)對(duì)象apply方法再執(zhí)行after函數(shù)對(duì)象apply方法的函數(shù)對(duì)象。 default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); }
//返回一個(gè)先執(zhí)行before函數(shù)對(duì)象apply方法再執(zhí)行當(dāng)前函數(shù)對(duì)象apply方法的函數(shù)對(duì)象 default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); }
compose 和 andThen 的不同之處是函數(shù)執(zhí)行的順序不同。
compose 函數(shù)先執(zhí)行參數(shù),然后執(zhí)行調(diào)用者,而 andThen 先執(zhí)行調(diào)用者,然后再執(zhí)行參數(shù)。
public static void main(String[] args) { Function<Integer, Integer> name = e -> e * 2; Function<Integer, Integer> square = e -> e * e; int value = name.andThen(square).apply(3); System.out.println("andThen value=" + value); int value2 = name.compose(square).apply(3); System.out.println("compose value2=" + value2); //返回一個(gè)執(zhí)行了apply()方法之后只會(huì)返回輸入?yún)?shù)的函數(shù)對(duì)象 Object identity = Function.identity().apply("huohuo"); System.out.println(identity); }
直接看結(jié)果:
andThen value=36
compose value2=18
huohuo
apply基本應(yīng)用
字符串長度記錄返回
public class MyFunction implements Function<String,Integer>{ @Override public Integer apply(String s) { return s.length(); } }
返回兩個(gè)字符串的連接,BiFunction與Function的不同就是傳入兩個(gè)參數(shù),依舊返回一個(gè)值。
public class MyBiFunction implements BiFunction<String, String, String> { @Override public String apply(String s, String s2) { return s+";"+s2; } }
最后調(diào)用結(jié)果:
private static String hello = "Nice to meet you"; private static String name = "my name is huohuo"; public static void main(String[] args) { MyFunction myFunction = new MyFunction(); MyBiFunction biFunction = new MyBiFunction(); int num = myFunction.apply(hello); String valueBi = biFunction.apply(hello, name); //hello長度返回 System.out.println(num); //語句整合返回 System.out.println(valueBi); }
返回值:
16
Nice to meet you;my name is huohuo
其實(shí)使用的過程感覺這些都無所必要,但是對(duì)于新特性以及代碼規(guī)范而言,即使是簡易代碼,也有了一個(gè)整合的過程。
Function簡單實(shí)踐僅此為止,下篇文章講述Predicate的使用。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot簡單使用SpringData的jdbc和durid
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot簡單使用SpringData的jdbc和durid,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06springcloud gateway聚合swagger2的方法示例
這篇文章主要介紹了springcloud gateway聚合swagger2的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作
這篇文章主要介紹了SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot項(xiàng)目打成War布署在Tomcat的詳細(xì)步驟
這篇文章主要介紹了SpringBoot項(xiàng)目打成War布署在Tomcat,本文分步驟結(jié)合圖文實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03springboot+thymeleaf整合阿里云OOS對(duì)象存儲(chǔ)圖片的實(shí)現(xiàn)
本文主要介紹了springboot+thymeleaf整合阿里云OOS對(duì)象存儲(chǔ)圖片的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05SpringBoot如何返回頁面的實(shí)現(xiàn)方法
SpringBoot中使用Controller和頁面的結(jié)合能夠很好地實(shí)現(xiàn)用戶的功能及頁面數(shù)據(jù)的傳遞。本文介紹了如何實(shí)現(xiàn)頁面的返回以及這里面所包含的坑,感興趣的可以了解一下2021-07-07