精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊 Java8 函數(shù)接口

開發(fā) 前端
本文主要演示了Java 8 API中的不同功能的函數(shù)接口,這些接口可以用作Lambda表達式。函數(shù)式流式編程方法在Java 8 之后的項目中應(yīng)用非常普遍。

概述

在Java 8之前,我們通常會為每種需要封裝單個功能的情況創(chuàng)建一個類,這意味著需要大量不必要的樣板代碼。

Java 8以Lambda表達式的形式帶來了一個強大的新語法改進,Lambda是一個匿名函數(shù)。

Function接口

建議所有函數(shù)接口都使用@FunctionalInterface注解,用于清楚傳達函數(shù)接口的目的,并且還允許編譯器在帶有該注解的接口,在不滿足條件的情況下生成編譯錯誤。

任何帶有SAM(單一抽象方法)的接口都是函數(shù)接口,被視為Lambda表達式。

Java8 的默認(rèn)方法不是抽象的,也不算在內(nèi),函數(shù)接口允許存在多個默認(rèn)方法。

Lambda最簡單、最通用的情況是一個函數(shù)接口,該接口具有一個接收一個值并返回另一個值的方法。單個參數(shù)的函數(shù)可以由Function接口表示,該接口通過其參數(shù)的類型和返回值進行參數(shù)化:

public interface Function<T, R> { … }

Function類型在標(biāo)準(zhǔn)JDK庫中的用法之一是Map.computeIfAbsent方法。此方法按鍵返回映射中的值,但如果映射中尚未存在鍵,則會計算值。要計算一個值,它使用傳遞的Function實現(xiàn):

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

Function接口還有一個默認(rèn)的compose方法,它允許我們將多個函數(shù)組合為一個函數(shù)并按順序執(zhí)行:

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ù)

由于基元類型不能是泛型類型參數(shù),因此對于最常用的基元類型double、int、long及其在參數(shù)和返回類型中的組合,函數(shù)接口有以下版本:

  • IntFunction、LongFunction、DoubleFunction:參數(shù)是指定類型的,返回類型是參數(shù)化的
  • ToIntFunction、ToLongFunction、ToDoubleFunction:返回類型為指定類型,參數(shù)是參數(shù)化的
  • DoubleToIntFunction、DoubleToLongFunction、IntToDoubleFunction、IntToLongFunction、LongToIntFunction和LongToDoubleFunction:參數(shù)和返回類型都定義為基元類型,由它們的名稱指定

例如,對于一個使用short并返回字節(jié)的函數(shù):

@FunctionalInterface
public interface ShortToByteFunction {

    byte applyAsByte(short s);

}

現(xiàn)在,我們可以編寫一個方法,使用ShortToByteFunction定義的規(guī)則將short數(shù)組轉(zhuǎn)換為字節(jié)數(shù)組:

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;
}

以下是我們?nèi)绾问褂盟鼘hort數(shù)組轉(zhuǎn)換為字節(jié)乘以2的數(shù)組:

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);

Bi函數(shù)接口

要用兩個參數(shù)定義lambda,我們必須使用名稱中包含“Bi”關(guān)鍵字的附加接口:BiFunction、ToDoubleBiFunction、ToIntBiFunction和ToLongBiFunction。

BiFunction同時生成了參數(shù)和返回類型,而ToDoubleBiFunction和其他函數(shù)允許我們返回基元值。

在標(biāo)準(zhǔn)API中使用此接口的典型示例之一是Map.replaceAll方法,它允許用一些計算值替換Map中的所有值。

讓我們使用一個BiFunction實現(xiàn),該實現(xiàn)接收一個鍵和一個舊值來計算工資的新值并返回。

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);

Suppliers函數(shù)接口

通常用它來提供數(shù)據(jù)產(chǎn)出,例如,讓我們定義一個函數(shù),它將一個值平方:

public double squareLazy(Supplier<Double> lazyValue) {
    return Math.pow(lazyValue.get(), 2);
}

Supplier<Double> lazyValue = () -> {
    Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);
    return 9d;
};

Double valueSquared = squareLazy(lazyValue);

讓我們使用一個靜態(tài)Stream.generate方法來創(chuàng)建一個Fibonacci數(shù)字流:

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;
});

我們使用一個數(shù)組而不是兩個變量,因為lambda內(nèi)部使用的所有外部變量都必須是有效的final。

Consumers函數(shù)接口

例如,讓我們通過在控制臺中打印問候語來問候姓名列表中的每個人。傳遞給List.forEach方法的lambda實現(xiàn)了Consumer函數(shù)接口:

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

還有專門版本的Consumer(DoubleConsumer、IntConsumer和LongConsumer),它們接收基元值作為參數(shù):

Map<String, Integer> ages = new HashMap<>();
ages.put("John", 25);
ages.put("Freddy", 24);
ages.put("Samuel", 30);

ages.forEach((name, age) -> System.out.println(name + " is " + age + " years old"));

另一組專門的BiConsumer版本由ObjDoubleConsumer、ObjIntConsumer和ObjLongConsumer組成,它們接收兩個參數(shù);其中一個參數(shù)是泛型的,另一個是基元類型。

Predicates函數(shù)接口

Predicates是一個接收值并返回布爾值的函數(shù)。

List<String> names = Arrays.asList("Angela", "Aaron", "Bob", "Claire", "David");

List<String> namesWithA = names.stream()
  .filter(name -> name.startsWith("A"))
  .collect(Collectors.toList());

在上面的代碼中,我們使用流API過濾列表,并只保留以字母“a”開頭的名稱。Predicates實現(xiàn)封裝了篩選邏輯。

與前面的所有示例一樣,此函數(shù)的IntPredicate、DoublePredicate和LongPredicate版本都接收基元值。

Operators函數(shù)接口

Operator接口是接收和返回相同值類型的函數(shù)的特殊情況。UnaryOperator接口接收一個參數(shù)。它在集合API中的一個用例是用相同類型的一些計算值替換列表中的所有值:

List<String> names = Arrays.asList("bob", "josh", "megan");
names.replaceAll(name -> name.toUpperCase());

當(dāng)然,我們可以簡單地使用方法引用來代替name->name.toUpperCase():

names.replaceAll(String::toUpperCase);

BinaryOperator最有趣的用例之一是歸約運算。假設(shè)我們想將一組整數(shù)聚合為所有值的總和。使用流API,我們可以使用收集器來實現(xiàn)這一點,但更通用的方法是使用reduce方法:

List<Integer> values = Arrays.asList(3, 5, 8, 9, 12);

int sum = values.stream()
  .reduce(0, (i1, i2) -> i1 + i2);

reduce方法接收一個初始累加器值和一個BinaryOperator函數(shù)。此函數(shù)的參數(shù)是一對相同類型的值;函數(shù)本身還包含一個邏輯,用于將它們連接到同一類型的單個值中。傳遞的函數(shù)必須是關(guān)聯(lián)的,這意味著值聚合的順序無關(guān)緊要,即應(yīng)滿足以下條件:

op.apply(a, op.apply(b, c)) == op.apply(op.apply(a, b), c)

其他

并不是所有的功能接口都出現(xiàn)在Java 8中。以前版本的Java中的許多接口都符合FunctionalInterface的約束,我們可以將它們用作lambda。

突出的例子包括并發(fā)API中使用的Runnable和Callable接口。在Java 8中,這些接口也用@FunctionalInterface注釋進行標(biāo)記。這使我們能夠極大地簡化并發(fā)代碼:

Thread thread = new Thread(() -> System.out.println("Hello From Another Thread"));
thread.start();

結(jié)論

本文主要演示了Java 8 API中的不同功能的函數(shù)接口,這些接口可以用作Lambda表達式。函數(shù)式流式編程方法在Java 8 之后的項目中應(yīng)用非常普遍。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-05-25 16:25:17

Java8Stream函數(shù)式接口

2021-08-03 07:51:43

Java 8 函數(shù)接口

2020-10-16 10:07:03

Lambda表達式Java8

2025-06-26 08:10:00

Java8函數(shù)

2022-12-26 07:47:37

JDK8函數(shù)式接口

2015-09-30 09:34:09

java8字母序列

2019-08-05 08:05:27

Java開發(fā)代碼

2022-01-06 07:39:17

Java Default關(guān)鍵字 Java 基礎(chǔ)

2020-07-24 08:11:04

Java8ava5語言

2021-01-14 10:00:57

Restful接口

2024-08-28 10:33:56

2024-08-19 02:00:00

FunctionJava8接口

2023-05-12 07:40:01

Java8API工具

2021-08-13 12:53:42

StringBuildStringJoineJava

2021-09-18 09:45:33

前端接口架構(gòu)

2020-05-27 08:05:33

MybatisMapper接口

2023-11-20 08:01:38

并發(fā)處理數(shù)Tomcat

2023-05-17 08:20:34

Java 17編程語言

2017-10-31 20:45:07

JavaJava8Optional

2020-05-29 07:20:00

Java8異步編程源碼解讀
點贊
收藏

51CTO技術(shù)棧公眾號

蜜桃av在线免费观看| 天天干天天操天天操| 97超碰成人| 色综合久久中文字幕综合网| 日本在线观看不卡| 97人妻精品一区二区三区动漫| 91精品电影| 亚洲精品久久久久国产| 亚洲第一中文av| 免费在线看电影| 国产亚洲欧美日韩日本| 97人人模人人爽人人喊38tv| 国产91国语对白在线| 天天射天天综合网| 亚洲精品影视在线观看| 初高中福利视频网站| 黄瓜视频成人app免费| 最好看的中文字幕久久| 欧美日韩高清在线一区| 精品久久久久中文慕人妻| 鲁大师影院一区二区三区| 久久久99久久| 99re视频在线观看| 国产精品成人无码| 亚洲美女啪啪| 另类视频在线观看| 欧洲美熟女乱又伦| 农村少妇一区二区三区四区五区 | 国产一区二区美女| 日韩免费av片在线观看| 国产无码精品久久久| 视频在线不卡免费观看| 国产午夜精品视频免费不卡69堂| 深田咏美中文字幕| 视频精品一区| 欧美精品v日韩精品v韩国精品v| 欧美 国产 综合| 伊人在我在线看导航| 国产精品久久久久久一区二区三区 | 91在线观看视频| 国产二区一区| 亚洲国产日韩在线观看| 国产在线一区二区综合免费视频| 国产精品久久久久久久美男 | 三级资源在线| 亚洲精品你懂的| 日韩三级电影| 黄色在线视频观看网站| 91免费小视频| 另类视频在线观看+1080p| 视频一区二区免费| 99视频精品在线| 国产一区二区视频在线免费观看 | 成人国产激情| 欧美日韩一区二区电影| 久久撸在线视频| 日本成人一区二区| 欧美日本一区二区三区四区| www亚洲成人| 97精品国产综合久久久动漫日韩| 色偷偷成人一区二区三区91| 免费大片在线观看| 亚洲精品一级二级| 91豆麻精品91久久久久久| 日本新janpanese乱熟| 日韩精品麻豆| 欧美日韩激情一区二区三区| 亚洲一区二区三区四区精品| 国产精品一区二区三区www| 欧美一区二区视频网站| 337p日本欧洲亚洲大胆张筱雨| 综合久久成人| 亚洲国产第一页| 日韩一级视频在线观看| 欧美先锋资源| 久久五月情影视| 久久综合综合久久| 国产视频欧美| 国产精品久久97| 一区二区三区播放| 国产99久久久国产精品潘金| 久久99精品久久久久久久久久 | 日本一区二区乱| 亚洲国产精彩中文乱码av| 欧美性xxxx图片| 日韩在线精品| 久久久久久久久久婷婷| 亚洲熟女综合色一区二区三区| 日本在线播放一区二区三区| 亚洲www视频| 日韩永久免费视频| 国产日韩在线不卡| 国产乱子伦精品视频| 欧美激情护士| 51午夜精品国产| 中文字幕第3页| 欧美美女视频| 久久久亚洲精选| 丰满人妻一区二区三区四区| 岛国精品在线观看| 亚洲精品成人a8198a| 色帝国亚洲欧美在线| 91久久精品一区二区二区| 永久免费黄色片| 国产成人精品免费视| 欧美高清不卡在线| 羞羞色院91蜜桃| 成人激情免费电影网址| 亚洲精品一区二区三| 98色花堂精品视频在线观看| 欧美日韩美少妇| 中文字幕一区三区久久女搜查官| 天天色综合色| 国产精品成人一区| 视频在线不卡| 亚洲图片自拍偷拍| 久国产精品视频| 国产成人3p视频免费观看| 久久久久久久电影一区| 国产一区二区三区成人| 久久精品夜色噜噜亚洲aⅴ| 日韩人妻无码精品久久久不卡| 四虎4545www精品视频| 亚洲黄一区二区| 精品在线免费观看视频| 韩国欧美一区二区| 色一情一乱一伦一区二区三区 | 在线中文字幕第一页| 欧美自拍偷拍一区| 久久精品一区二区免费播放| 在线观看视频日韩| 91成人免费视频| 黄色在线播放网站| 欧美视频一区在线观看| 成人性生交大免费看| 99伊人成综合| 九色一区二区| 男人久久天堂| 亚洲国产日韩欧美在线图片| 久久久精品视频在线| 国内久久精品视频| 天堂av免费看| 成人精品在线| 毛片精品免费在线观看| 91亚洲视频在线观看| 国产精品久久久久影院| 国产一伦一伦一伦| 日韩精品免费一区二区在线观看| 国产精品高潮呻吟久久av野狼| 国模精品一区二区| 欧美三区在线观看| 五月天婷婷丁香网| 久久99日本精品| 中文字幕一区二区三区5566| 91精品网站在线观看| 久久久成人精品视频| 一级特黄录像免费看| 成人免费在线播放视频| 一本之道在线视频| 免费观看亚洲视频大全| 综合网日日天干夜夜久久| 一本色道久久综合亚洲| 亚洲视频免费观看| 三上悠亚 电影| 尹人成人综合网| 蜜桃av色综合| 国产成人77亚洲精品www| 久久国产一区二区三区| 性猛交富婆╳xxx乱大交天津| 亚洲电影一区二区三区| 成人影视免费观看| 青青国产91久久久久久| 最新黄色av网站| 国产精品一线| 国产91久久婷婷一区二区| 尤物视频在线免费观看| 日韩欧美在线综合网| 日韩久久久久久久久| 久久久精品免费网站| 99re6在线观看| 欧美午夜久久| 日本精品一区二区三区视频| 亚洲伊人精品酒店| 97婷婷大伊香蕉精品视频| 国产精品视频一区二区久久| 欧美精品欧美精品系列| 国产精品 欧美 日韩| 久久精品一级爱片| av地址在线观看| 视频一区视频二区中文| 黄色片免费在线观看视频| 精品在线播放| 91麻豆精品秘密入口| 这里有精品可以观看| 麻豆成人在线看| 美女做暖暖视频免费在线观看全部网址91| 欧美日韩不卡一区二区| 在线观看 中文字幕| 国产精品第一页第二页第三页| 国产免费一区二区三区最新6| 日一区二区三区| 大伊香蕉精品视频在线| 成人精品电影| 精品国产一区二区三区麻豆小说| 日本亚洲欧洲无免费码在线| 91av中文字幕| 亚洲制服国产| 在线播放日韩av| 亚洲欧美日本在线观看| 欧美一区二区三区播放老司机| 日本免费在线观看视频| 亚洲一区视频在线| 日韩精品123区| 久久久不卡网国产精品二区| 稀缺小u女呦精品呦| 九九国产精品视频| 欧美在线观看视频网站| 一区二区日本视频| 狠狠噜天天噜日日噜| 久久久久免费av| 午夜老司机精品| 亚洲宅男一区| 国产精品一区二区免费| 国产一区二区视频在线看| 国产精品久久久久久久电影| 欧美成人a交片免费看| 国内精品久久久久| 欧洲性视频在线播放| 久久精品中文字幕免费mv| 3p在线观看| 亚洲网站在线看| 欧美日本韩国一区二区| 亚洲精品v天堂中文字幕 | 国产剧情一区二区| 亚洲最大天堂网| 久久精品国产**网站演员| 欧美日韩在线观看不卡| 快she精品国产999| 免费在线观看的毛片| 先锋影音国产一区| 久久9精品区-无套内射无码| 国产一区二区三区的电影 | 久久久.www| 亚洲激情图片一区| 国产精品老熟女一区二区| 亚洲欧美日韩综合aⅴ视频| 亚洲二区在线播放| 玉足女爽爽91| 久久99久久98精品免观看软件| 亚洲精品国产无天堂网2021| 欧美色图亚洲视频| 亚洲制服欧美中文字幕中文字幕| 久久久久成人精品无码| 性做久久久久久免费观看| www成人在线| 一本色道a无线码一区v| 丰满人妻老熟妇伦人精品| 在线观看亚洲a| 中文字幕欧美在线观看| 91精品久久久久久蜜臀| 性一交一乱一乱一视频| 精品sm在线观看| 蜜桃视频在线观看网站| 中文字幕亚洲综合久久| a视频在线播放| 国内久久久精品| 韩日成人影院| 成人免费观看a| 国产精品毛片视频| 蜜桃av久久久亚洲精品| 99久久99久久精品国产片桃花| 91大学生片黄在线观看| 一区二区日韩免费看| 一区二区三区 欧美| 国产福利91精品一区二区三区| 日韩精品―中文字幕| 制服诱惑一区二区| 天天操天天爱天天爽| 国产精品主播直播| 加勒比精品视频| 国产精品网站在线| 久草视频中文在线| 色播五月激情综合网| 国产精品视频a| 亚洲国产精品电影在线观看| 丁香在线视频| 欧美激情一二区| 成人做爰免费视频免费看| 国产chinese精品一区二区| 国产麻豆精品久久| 欧美久久久久久久久久久久久久| 亚洲欧美日韩精品一区二区| 欧美国产日韩另类| 91蜜桃网址入口| 成人在线观看小视频| 欧美视频在线观看 亚洲欧| 国产免费福利视频| 亚洲女人天堂网| 欧美巨大xxxx做受沙滩| 国产成人综合久久| 成人精品毛片| 国产欧美自拍视频| 久久久精品五月天| 精人妻一区二区三区| 欧美高清一级片在线观看| 国产无遮挡aaa片爽爽| 91精品婷婷国产综合久久性色| 日韩欧美亚洲系列| 欧美疯狂xxxx大交乱88av| 国产精品久久久久久妇女| 国产区一区二区| 欧美一区二区| 国产探花在线看| 久久精品亚洲精品国产欧美kt∨| 久久久久久欧美精品se一二三四| 欧美日韩中文字幕一区| 三级黄视频在线观看| 欧美人与性动交a欧美精品| 青青国产精品| 午夜免费电影一区在线观看| 欧美一级播放| 水蜜桃av无码| 亚洲一区二区三区免费视频| 国产精品无码久久久久成人app| 亚洲欧美中文在线视频| av中文字幕在线观看第一页 | 嫩草av久久伊人妇女超级a| 99久久国产综合精品女不卡| 青娱乐在线视频免费观看| 欧美自拍偷拍一区| 国产youjizz在线| 国产精品v日韩精品| 亚州av一区| 无码精品a∨在线观看中文| 成人高清免费观看| 久久婷婷国产麻豆91| 日韩精品一区二区三区蜜臀| 1区2区在线观看| 亚洲mm色国产网站| 欧美激情1区| 日本少妇xxx| 亚洲一区二区三区小说| 性生活免费网站| 国产做受高潮69| 欧美激情久久久久久久久久久| 国产va亚洲va在线va| 成人激情校园春色| 男人的天堂一区二区| 亚洲免费视频观看| 日韩免费电影| 手机成人在线| 久久精品国产**网站演员| 国产免费久久久久| 日韩欧美中文一区二区| 国产在线拍揄自揄拍视频| 国外成人在线视频网站| 亚洲影院在线| 国产成人福利在线| 欧美日韩成人高清| 日本动漫同人动漫在线观看| 国产精品一区二区三区在线 | 欧美做爰性生交视频| 国产一区二区在线| gogogo高清免费观看在线视频| 最好看的中文字幕久久| 国产小视频免费观看| 欧美在线www| 俺要去色综合狠狠| 又黄又爽又色的视频| 亚洲成人av在线电影| 九九热视频在线观看| 国产在线久久久| 亚洲午夜极品| 91成人破解版| 91精品国产免费久久综合| 不卡av免费观看| 清纯唯美一区二区三区| 国产麻豆精品一区二区| 91香蕉在线视频| 这里只有精品视频| 91在线一区| 成人在线免费播放视频| 亚洲欧美一区二区久久| 天天插天天干天天操| 国产精品影片在线观看| 亚洲性人人天天夜夜摸| 欧美精品欧美极品欧美激情| 欧美日韩亚洲另类| 毛片网站在线看| 亚洲欧洲国产精品久久| 成人中文字幕合集| 亚洲字幕av一区二区三区四区| 久久久久久亚洲| 日韩在线精品| 可以直接看的无码av| 7777精品伊人久久久大香线蕉 | 6080午夜不卡| xxxxxx欧美| 黄色a级片免费看| 日本一区二区成人|