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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java steam说明_Java 8 Steam API map和flatMap方法使用详解

發布時間:2023/12/20 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java steam说明_Java 8 Steam API map和flatMap方法使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一對多的提取內容用flatmap,一對一用map

java 8 stream api 中有兩個方法map和flatMap非常實用,應用場景也非常廣泛,能極大提升編程效率。下面我們詳細介紹一下這兩個方法的用法。

map方法

我們來看個示例:把一個整數列表轉換成字符串列表,java 8之前常用的實現方法如下

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

ListstrList = new ArrayList<>();

for (int num : numList) {

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

}

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

ListstrList = numList.stream()

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

.collect(Collectors.toList());

map方法接受一個lambda表達式,這個表達式是一個函數,輸入類型是集合元素的類型,輸出類型是任意類型

it -> Integer.toString(it)

在示例中就是將集合中的整數元素逐個轉換成字符串類型。這種寫法和常規的編程思路不同,卻有點像SQL

select id from table1

這條SQL語句讀取一張表的id字段,id是int類型,我們將他轉換成字符類型,實現方法如下

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

SQL中的select對應的是map方法

cast(id as CHAR(10)) 對應的就是 it -> Integer.toString(it)

我們還可以用map實現很多效果,比如轉換成符合要求的bool列表

ListboolList = numList.stream()

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

.collect(Collectors.toList());

或者轉換成某種對象列表

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

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

ListobjList = numList.stream()

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

.collect(Collectors.toList());

}

}

都可以非常迅速的實現,和那些流水賬式的代碼告別

ListobjList2 = new ArrayList<>();

for (int num : numList) {

objList2.add(new Klass(num));

}

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

flatMap方法

我們把需求擴展下

先定義兩個類型

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 Listgroup = new ArrayList<>();

public KlassGroup(Klass... objList) {

for (Klass item : objList) {

this.group.add(item);

}

}

public ListgetKlassList() {

return group;

}

}

KlassGroup類中定義了一個Klass類的列表

現在我們有一組KlassGroup對象

ListgroupList = 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))

);

需要將每個KlassGroup對象中的那些Klass類取出來,放到一個ArrayList里面,得到一個List。我們嘗試著用map方法來實現

List> result = groupList.stream()

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

.collect(Collectors.toList());

哈,不成功,我們想要的結果是List,現在得到了 List>。當然,我們可以輕而易舉的解決這個問題

Listresult2 = new ArrayList<>();

for (KlassGroup group : groupList) {

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

result2.add(klass);

}

}

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

Listresult3 = groupList.stream()

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

.collect(Collectors.toList());

一行代碼就實現了

stream api 的 flatMap方法接受一個lambda表達式函數, 函數的返回值必須也是一個stream類型,flatMap方法最終會把所有返回的stream合并,map方法做不到這一點,如果用map去實現,會變成這樣一個東西

List> result3 = groupList.stream()

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

.collect(Collectors.toList());

flatMap的思路在其他語言中也有體現,比如C# Linq中的 SelectMany 方法,F# 中的 List.collect方法都有同樣的作用。用函數式編程的說法,他們都實現了 monad,當然,monad這個概念很難是通俗的描述清楚,此文中就不展開了。

java 8 stream api 中各方法可以極大的簡化集合操作,帶來大幅度的編碼效率提升,如果是java 8及以上的版本,一定要優先使用,stream api絕對是java中史詩級的工作效率提升利器。

總結

以上是生活随笔為你收集整理的java steam说明_Java 8 Steam API map和flatMap方法使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。