JAVA中的函數(shù)式接口Function和BiFunction詳解
函數(shù)式接口
只有一個(gè)抽象方法的接口我們稱之為函數(shù)接口。 ?
JDK的函數(shù)式接口都加上了@FunctionalInterface注解進(jìn)行標(biāo)識(shí)。但是無(wú)論是否加上該注解只要接口中只有一個(gè)抽象方法,都是函數(shù)式接口。
為什么要用函數(shù)式接口
- 代碼簡(jiǎn)潔,開發(fā)快速
- 可以使用極簡(jiǎn)的lambda表達(dá)式實(shí)例化接口
其實(shí)就是為了適應(yīng)轉(zhuǎn)化成lambda表達(dá)式,寫成具體的方法也可以,但是就是多要多寫一些代碼,引入函數(shù)式接口就是為了配合轉(zhuǎn)化成極簡(jiǎn)lambda表達(dá)式簡(jiǎn)化代碼
怎么使用Function ,BiFunction計(jì)算轉(zhuǎn)換接口
Function
舉例如下:一個(gè)測(cè)試字符串長(zhǎng)度的例子
沒轉(zhuǎn)化之前
public class function { static Function<String, Integer> strLen = new Function<String, Integer>() { @Override public Integer apply(String s) { int length = s.length(); return length; } }; public static void main(String[] args) { System.out.println("Function 示例, 字符串長(zhǎng)度: " + strLen.apply("Hello")); } }
轉(zhuǎn)化之后
public class function { static Function<String, Integer> strLen = s -> { int length = s.length(); return length; }; public static void main(String[] args) { System.out.println("Function 示例, 字符串長(zhǎng)度: " + strLen.apply("Hello")); } }
可以再簡(jiǎn)化
public class function { static Function<String, Integer> strLen = String::length; public static void main(String[] args) { System.out.println("Function 示例, 字符串長(zhǎng)度: " + strLen.apply("Hello")); } }
測(cè)試結(jié)果:
上面這個(gè)例子其實(shí)沒有必要?jiǎng)?chuàng)建一個(gè)接口來(lái)返回字符串的長(zhǎng)度,這是簡(jiǎn)化操作,例如下面想將一個(gè)過(guò)濾桶中的數(shù)據(jù)進(jìn)行轉(zhuǎn)化封裝,那么你大可寫一個(gè)轉(zhuǎn)化函數(shù),加上參數(shù)和返回值,也可以利用JAVA8中封裝好的函數(shù)式計(jì)算轉(zhuǎn)換接口Function進(jìn)行編寫,如下
private Function<Filters , LinkedHashMap<String, Long>> RESULT_CONVENT = new Function<Filters, LinkedHashMap<String, Long>>() { @Override public LinkedHashMap<String, Long> apply(Filters term) { LinkedHashMap<String, Long> result = new LinkedHashMap<>(); for (Filters.Bucket temp : term.getBuckets()) { MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time"); for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) { result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount()); } } return result; } };
轉(zhuǎn)化成lambda表達(dá)式后
private Function<Filters , LinkedHashMap<String, Long>> RESULT_CONVENT = term -> { LinkedHashMap<String, Long> result = new LinkedHashMap<>(); for (Filters.Bucket temp : term.getBuckets()) { MultiBucketsAggregation statisticTimeTerm = temp.getAggregations().get("Time"); for (MultiBucketsAggregation.Bucket timeTemp : statisticTimeTerm.getBuckets()) { result.put(timeTemp.getKeyAsString(), timeTemp.getDocCount()); } } return result; };
這樣寫的目的就是轉(zhuǎn)化成lambda表達(dá)式,轉(zhuǎn)化為函數(shù)式編程思想,熟悉函數(shù)式接口 同樣的下面的BiFunction功能更加強(qiáng)大,可以兩個(gè)參數(shù)的計(jì)算轉(zhuǎn)換
BiFunction兩個(gè)參數(shù)的計(jì)算轉(zhuǎn)換
public class function { static BiFunction<String, Integer, Boolean> expectLength = (s, num) -> s.length() == num; public static void main(String[] args) { System.out.print("BiFunction 示例, 字符串長(zhǎng)度是否符合預(yù)期? " + expectLength.apply("21yi", 4)); } }
測(cè)試結(jié)果
到此這篇關(guān)于JAVA中的函數(shù)式接口Function和BiFunction詳解的文章就介紹到這了,更多相關(guān)函數(shù)式接口Function和BiFunction內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用feign發(fā)送http請(qǐng)求解析報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了使用feign發(fā)送http請(qǐng)求解析報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03教你如何監(jiān)控 Java 線程池運(yùn)行狀態(tài)的操作(必看)
這篇文章主要介紹了教你如何監(jiān)控 Java 線程池運(yùn)行狀態(tài)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02springboot項(xiàng)目不加端口號(hào)也可以訪問(wèn)項(xiàng)目的方法步驟分析
這篇文章主要介紹了springboot項(xiàng)目不加端口號(hào)也可以訪問(wèn)項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04解決idea啟動(dòng)報(bào)錯(cuò)javax.imageio.IIOException的問(wèn)題
這篇文章主要介紹了idea啟動(dòng)報(bào)錯(cuò)javax.imageio.IIOException,解決打不開idea問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09springboot+quartz以持久化的方式實(shí)現(xiàn)定時(shí)任務(wù)的代碼
這篇文章主要介紹了springboot+quartz以持久化的方式實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決
這篇文章主要介紹了Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11登錄EasyConnect后無(wú)法通過(guò)jdbc訪問(wèn)服務(wù)器數(shù)據(jù)庫(kù)問(wèn)題的解決方法
描述一下近期使用EasyConnect遇到的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于登錄EasyConnect后無(wú)法通過(guò)jdbc訪問(wèn)服務(wù)器數(shù)據(jù)庫(kù)問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02