最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java?中的函數(shù)式接口

 更新時間:2021年12月23日 10:02:00   作者:獨家雨天  
這篇文章主要為大家介紹了Java中的函數(shù)式接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>

@FunctionalInterface注解

如果你想自己定義個新的函數(shù)式接口,強烈建議你加上*@FunctionalInterface* 注解。可以更好地揭示我們定義這個接口的意思,同時也可以讓編譯器幫助我們檢查接口定義的正確與否。在任何情況下,我們將一個接口只有一個抽象方法的接口都認(rèn)為是函數(shù)是接口。這樣的接口實現(xiàn),才可以被看成是 lambda 的表達(dá)式。可能你會說,不對啊,明明我看到很多函數(shù)式接口是包含了多個方法的。這里需要說明一點的是,函數(shù)式接口只能有一個抽象方法,但是可以有多個默認(rèn)實現(xiàn)的方法。

最簡單的函數(shù)式接口

通常情況下,我們滿足數(shù)據(jù)的映射,那就是輸入一個數(shù)據(jù),映射(對應(yīng))輸出一個數(shù)據(jù)。

public interface Function<T, R> { … }	

比如,我們調(diào)用Map 方法中computeIfAbsent 方法來實現(xiàn),當(dāng)我們嘗試獲取 key 值為 John 的值是,如果不存在,則我們生成一個(key,key.length())的數(shù)據(jù)。

Map<String, Integer> nameMap = new HashMap<>();
Integer value = nameMap.computeIfAbsent("John", s -> s.length());

當(dāng)然也可以采用冒號的語法糖

Integer value = nameMap.computeIfAbsent("John", String::length);

函數(shù)式接口含有一個compose 方法來組合 多個函數(shù)表達(dá)式。(類似于數(shù)學(xué)中嵌套表達(dá)式,y=f1(f2(x))

Function<Integer, String> intToString = Object::toString;
Function<String, String> quote = s -> "'" + s + "'";
Function<Integer, String> quoteIntToString = quote.compose(intToString);
assertEquals("'5'", quoteIntToString.apply(5));

其中第一個函數(shù)表達(dá)式是,將對象轉(zhuǎn)換為字符串,第二個則是對字符串加上雙引號。

基礎(chǔ)數(shù)據(jù)類型的函數(shù)表達(dá)式

在 JDK 的 Function 包下的有很多基礎(chǔ)類型的函數(shù)方法接口,但是這些接口都不是可以直接使用的,都需要自己實現(xiàn)。

  • IntFunction, LongFunction, DoubleFunction: 輸入是具體的(Int,Long,Double),但是輸出是可以指定的。
  • ToIntFunction, ToLongFunction, ToDoubleFunction: 輸入是可以自定義的,輸出是具體的(int,Long,Double)。
  • DoubleToIntFunction, DoubleToLongFunction, IntToDoubleFunction, IntToLongFunction, LongToIntFunction, LongToDoubleFunction: 輸入和輸出都是指定的基礎(chǔ)數(shù)據(jù)類型。

下面讓我們根據(jù)一個輸入 Short 然后輸出 Byte 數(shù)據(jù)類型,來說明用法。java.util.function 下不含這兩個數(shù)據(jù)類型映射。

我們先定義一個函數(shù)式接口,從 Short 類型映射到 Byte 類型。

@FunctionalInterface
public interface ShortToByteFunction {
    byte applyAsByte(short s);
}

比如,我們實現(xiàn)如下的邏輯,輸入一個 short 類型的數(shù)組,然后每個元素都應(yīng)用我們定義函數(shù)式方法實現(xiàn)。

public byte[] transformArray(short[] array, ShortToByteFunction function) {
    byte[] transformedArray = new byte[array.length];
    for (int i = 0; i < array.length; i++) {
        transformedArray[i] = function.applyAsByte(array[i]);
    }
    return transformedArray;
}

然后 每個元素的邏輯,通過 lambda 來具體實現(xiàn)。比如,每個 將每個 short 類型都乘以 2 再轉(zhuǎn)換成 Byte。

short[] array = {(short) 1, (short) 2, (short) 3};
byte[] transformedArray = transformArray(array, s -> (byte) (s * 2));
byte[] expectedArray = {(byte) 2, (byte) 4, (byte) 6};
assertArrayEquals(expectedArray, transformedArray);

二元輸入?yún)?shù)的函數(shù) Two-Arity Function Specializations

也就是輸入兩個不同的參數(shù),輸出一個指定數(shù)據(jù)類型的函數(shù)。在 JDK 中,帶有 Bi 名稱的就是類型。比如BiFunction, ToDoubleBiFunction, ToIntBiFunction, and ToLongBiFunction.

一個典型的用法,就是 Map 中的 replaceAll 方法。

Map<String, Integer> salaries = new HashMap<>();
salaries.put("John", 40000);
salaries.put("Freddy", 30000);
salaries.put("Samuel", 50000);
salaries.replaceAll((name, oldValue) -> 
  name.equals("Freddy") ? oldValue : oldValue + 10000);

其中,將 map 中每個元素 (key,value) 都引用 lambda 中函數(shù)表達(dá)式來重新應(yīng)用。

Suppliers 供給型接口 & Consumers 消費型接口

可以理解為一個生產(chǎn)者,通常沒有輸入,但是能夠更具特定規(guī)則輸出數(shù)據(jù)(元素)。典型的應(yīng)用就是一個序列生成器。JDK 里面有更豐富接口定義,如BooleanSupplier, DoubleSupplier, LongSupplier 和 IntSupplier.

int[] fibs = {0, 1};
Stream<Integer> fibonacci = Stream.generate(() -> {
    int result = fibs[1];
    int fib3 = fibs[0] + fibs[1];
    fibs[0] = fibs[1];
    fibs[1] = fib3;
    return result;
});

與Supplier 對應(yīng)的 Consumer,接收一個輸入?yún)?shù),但是不返回任何數(shù)據(jù)類型。最常用的就是實現(xiàn) foreach 中的消費每個迭代元素。

List<String> names = Arrays.asList("John", "Freddy", "Samuel");
names.forEach(name -> System.out.println("Hello, " + name));

Predicates 斷言型接口

通常理解,該接口會返回 True 或 False 的數(shù)據(jù)類型,常見的就是 Stream 中的 Filter 接口實現(xiàn)的邏輯。

Operators

該函數(shù)式接口主要就是,輸入一個數(shù)據(jù)類型,返回同樣的數(shù)據(jù)類型。

names.replaceAll(String::toUpperCase);

有一個例外,就是 BinaryOperator 函數(shù)式接口是一個歸并操作,匯聚和輸入的列表元素。典型的入 reduce 函數(shù)。

List<Integer> values = Arrays.asList(3, 5, 8, 9, 12);
int sum = values.stream()
  .reduce(0, (i1, i2) -> i1 + i2);

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼

    springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼

    這篇文章主要介紹了springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Java中的JSONObject使用解讀

    Java中的JSONObject使用解讀

    本文詳細(xì)介紹了Java中處理JSON數(shù)據(jù)的JSONObject類,包括創(chuàng)建、基本操作、高級特性和錯誤處理,通過示例代碼和解釋,讀者可以掌握J(rèn)SONObject的基本用法和處理技巧
    2025-01-01
  • idea插件篇之java內(nèi)存分析工具(JProfiler)的使用

    idea插件篇之java內(nèi)存分析工具(JProfiler)的使用

    這篇文章主要介紹了idea插件篇之java內(nèi)存分析工具(JProfiler),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring Cloud Eureka 服務(wù)上下線監(jiān)控的實現(xiàn)

    Spring Cloud Eureka 服務(wù)上下線監(jiān)控的實現(xiàn)

    這篇文章主要介紹了Spring Cloud Eureka 服務(wù)上下線監(jiān)控的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Maven中jar包下載失敗的幾種解決方法

    Maven中jar包下載失敗的幾種解決方法

    本文主要介紹了Maven中jar包下載失敗的幾種解決方法,包括配置國內(nèi)Maven源、刪除本地jar包目錄重新下載,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 詳解Java?缺失的特性擴展方法

    詳解Java?缺失的特性擴展方法

    這篇文章主要為大家介紹了Java?缺失的特性擴展方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 解決@PathVariable出現(xiàn)點號.時導(dǎo)致路徑參數(shù)截斷獲取不全的問題

    解決@PathVariable出現(xiàn)點號.時導(dǎo)致路徑參數(shù)截斷獲取不全的問題

    這篇文章主要介紹了解決@PathVariable出現(xiàn)點號.時導(dǎo)致路徑參數(shù)截斷獲取不全的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring AOP定義AfterReturning增加實例分析

    Spring AOP定義AfterReturning增加實例分析

    這篇文章主要介紹了Spring AOP定義AfterReturning增加,結(jié)合實例形式分析了Spring面相切面AOP定義AfterReturning增加相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2020-01-01
  • Java開發(fā)實現(xiàn)猜拳游戲

    Java開發(fā)實現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Jackson自定義序列化與反序列化注解詳解

    Jackson自定義序列化與反序列化注解詳解

    這篇文章主要介紹了Jackson自定義序列化與反序列化注解詳解,某些場景下,我們使用Jackson對數(shù)據(jù)進行序列化或反序列化的時候,需要對某些數(shù)據(jù)進行特殊處理,需要的朋友可以參考下
    2023-11-11

最新評論

莎车县| 鸡泽县| 蒙城县| 威海市| 汉中市| 庄浪县| 三原县| 安新县| 华阴市| 和政县| 通州区| 永仁县| 荔波县| 谷城县| 奉化市| 彩票| 东宁县| 青铜峡市| 呼伦贝尔市| 乐昌市| 英德市| 吉林省| 南充市| 兰溪市| 正安县| 芦溪县| 普洱| 噶尔县| 岳池县| 高邮市| 岫岩| 贵阳市| 托克逊县| 安化县| 英超| 黄山市| 香格里拉县| 鹤庆县| 邢台县| 阳城县| 望奎县|