日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java flatmap_Java 8 Steam API map和flatMap方法使用详解

發(fā)布時(shí)間:2025/3/15 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java flatmap_Java 8 Steam API map和flatMap方法使用详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java 8 stream api 中有兩個(gè)方法map和flatMap非常實(shí)用,應(yīng)用場(chǎng)景也非常廣泛,能極大提升編程效率。下面我們?cè)敿?xì)介紹一下這兩個(gè)方法的用法。

map方法

我們來(lái)看個(gè)示例:把一個(gè)整數(shù)列表轉(zhuǎn)換成字符串列表,java 8之前常用的實(shí)現(xiàn)方法如下

List numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

List strList = new ArrayList<>();

for (int num : numList) {

strList.add(Integer.toString(num));

}

這種寫法比較符合直覺,但略顯繁瑣。如果用java 8的stream api的map方法則可以把這個(gè)過(guò)程變的非常簡(jiǎn)潔

List strList = numList.stream()

.map(it -> Integer.toString(it))

.collect(Collectors.toList());

map方法接受一個(gè)lambda表達(dá)式,這個(gè)表達(dá)式是一個(gè)函數(shù),輸入類型是集合元素的類型,輸出類型是任意類型

it -> Integer.toString(it)

在示例中就是將集合中的整數(shù)元素逐個(gè)轉(zhuǎn)換成字符串類型。這種寫法和常規(guī)的編程思路不同,卻有點(diǎn)像SQL

select id from table1

這條SQL語(yǔ)句讀取一張表的id字段,id是int類型,我們將他轉(zhuǎn)換成字符類型,實(shí)現(xiàn)方法如下

select cast(id as CHAR(10)) as id from table1

SQL中的select對(duì)應(yīng)的是map方法

cast(id as CHAR(10)) 對(duì)應(yīng)的就是 it -> Integer.toString(it)

我們還可以用map實(shí)現(xiàn)很多效果,比如轉(zhuǎn)換成符合要求的bool列表

List boolList = numList.stream()

.map(it -> it > 5 ? true : false)

.collect(Collectors.toList());

或者轉(zhuǎn)換成某種對(duì)象列表

public class Main {

private static class Klass {

private int field;

public Klass(int field) {

this.field = field;

}

@Override

public String toString() {

return "field=" + field;

}

}

public static void main(String[] args) {

List numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

List objList = numList.stream()

.map(it -> new Klass(it))

.collect(Collectors.toList());

}

}

都可以非常迅速的實(shí)現(xiàn),和那些流水賬式的代碼告別

List objList2 = new ArrayList<>();

for (int num : numList) {

objList2.add(new Klass(num));

}

其實(shí)這種寫法就是函數(shù)式編程的聲明性編程,將代碼寫成表達(dá)式類型。而我們常用的SQL語(yǔ)言天生就是函數(shù)式語(yǔ)言。

flatMap方法

我們把需求擴(kuò)展下

先定義兩個(gè)類型

private static class Klass {

private int field;

public Klass(int field) {

this.field = field;

}

@Override

public String toString() {

return "field=" + field;

}

}

private static class KlassGroup {

private List group = new ArrayList<>();

public KlassGroup(Klass... objList) {

for (Klass item : objList) {

this.group.add(item);

}

}

public List getKlassList() {

return group;

}

}

KlassGroup類中定義了一個(gè)Klass類的列表

現(xiàn)在我們有一組KlassGroup對(duì)象

List groupList = Arrays.asList(

new KlassGroup(new Klass(1), new Klass(2), new Klass(3)),

new KlassGroup(new Klass(4), new Klass(5), new Klass(6)),

new KlassGroup(new Klass(7), new Klass(8), new Klass(9)),

new KlassGroup(new Klass(10))

);

需要將每個(gè)KlassGroup對(duì)象中的那些Klass類取出來(lái),放到一個(gè)ArrayList里面,得到一個(gè)List。我們嘗試著用map方法來(lái)實(shí)現(xiàn)

List> result = groupList.stream()

.map(it -> it.getKlassList())

.collect(Collectors.toList());

哈,不成功,我們想要的結(jié)果是List,現(xiàn)在得到了 List>。當(dāng)然,我們可以輕而易舉的解決這個(gè)問題

List result2 = new ArrayList<>();

for (KlassGroup group : groupList) {

for (Klass klass : group.getKlassList()) {

result2.add(klass);

}

}

但是這種套了兩層for循環(huán)的代碼太丑陋了。面對(duì)這種需求,flatMap可以大展身手了

List result3 = groupList.stream()

.flatMap(it -> it.getKlassList().stream())

.collect(Collectors.toList());

一行代碼就實(shí)現(xiàn)了

stream api 的 flatMap方法接受一個(gè)lambda表達(dá)式函數(shù), 函數(shù)的返回值必須也是一個(gè)stream類型,flatMap方法最終會(huì)把所有返回的stream合并,map方法做不到這一點(diǎn),如果用map去實(shí)現(xiàn),會(huì)變成這樣一個(gè)東西

List> result3 = groupList.stream()

.map(it -> it.getKlassList().stream())

.collect(Collectors.toList());

flatMap的思路在其他語(yǔ)言中也有體現(xiàn),比如C# Linq中的 SelectMany 方法,F# 中的 List.collect方法都有同樣的作用。用函數(shù)式編程的說(shuō)法,他們都實(shí)現(xiàn)了 monad,當(dāng)然,monad這個(gè)概念很難是通俗的描述清楚,此文中就不展開了。

java 8 stream api 中各方法可以極大的簡(jiǎn)化集合操作,帶來(lái)大幅度的編碼效率提升,如果是java 8及以上的版本,一定要優(yōu)先使用,stream api絕對(duì)是java中史詩(shī)級(jí)的工作效率提升利器。

總結(jié)

以上是生活随笔為你收集整理的java flatmap_Java 8 Steam API map和flatMap方法使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91久久精品一区二区 | 日韩脚交footjobhd | 美女被日网站 | 午夜色网 | 卡通动漫亚洲综合 | 欧美大黄| 新呦u视频一区二区 | 三级视频在线看 | 久久精品日韩无码 | 欧美性视频一区二区 | 337p色噜噜 | 午夜在线观看影院 | 亚洲国产第一 | 成人免费看高清电影在线观看 | 日本人の夫妇交换 | 日韩精品啪啪 | 狼人香蕉 | 中国特级黄色大片 | 光明影院手机版在线观看免费 | 91国模少妇一区二区三区 | 桃色在线视频 | 日本中文字幕网 | 韩国电影大尺度在线观看 | av青草| 午夜成人亚洲理伦片在线观看 | 亚洲免费在线看 | 久草资源在线观看 | 国产日本精品 | 男操女免费网站 | 人人精品久久 | 久久久视频在线观看 | 国产成人亚洲一区二区 | 蜜桃av乱码一区二区三区 | 五月婷婷狠狠干 | 欧美一区二区免费在线观看 | 精品国产一区二区三区四区 | 九九av在线 | 午夜成年人| 国产自偷 | 正在播放一区二区 | 亚洲国内在线 | 国产毛片久久久久久久 | 久操香蕉| 久久精品一区二区三 | 啪啪网站免费看 | 亚洲欧美日韩一区在线观看 | 美女在线观看视频 | 自拍偷拍激情小说 | 久久久精品免费观看 | 青青久久av | 久久精品久久久久 | 久久久久久久久久久久久女过产乱 | 在线97视频 | 日韩黄色免费观看 | 国产毛片久久久 | 欧美日韩无 | 精品国产乱码久久久久 | 美女扣逼喷水视频 | 男人狂揉女人下部视频 | 国产视频手机在线播放 | 久草青青视频 | 冈本视频在线观看 | 欧美精品成人久久 | 九色视频丨porny丨丝袜 | 在线观看免费人成视频 | 黄色日韩| 国产亚洲天堂 | 免费一级片视频 | av官网| 777777av | 嫩草av91 | 四虎av在线 | 一道本av在线 | 影音先锋在线中文字幕 | 侵犯亲女在线播放视频 | 亚洲激情影院 | 在线观看日韩av电影 | 最近高清中文在线字幕在线观看 | 国产成人资源 | 国产乱论视频 | 国产性按摩 | 国产精品av在线 | 成人免费a视频 | 亚洲区免费 | 天天爱天天做 | 91禁外国网站 | 国产又爽又黄免费软件 | 欧美黄页在线观看 | 欧美一区二区三区免费看 | 91精品视频在线看 | 国产又粗又猛又爽又黄的视频小说 | 欧美成人区 | 男人天堂2021 | 老妇荒淫牲艳史 | 少妇又色又紧又爽又刺激视频 | 亚洲欧美在线观看 | 黄色一级视频网站 | 国产午夜福利一区 | av播放在线 |