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

Java中Stream流Map分組方式詳細(xì)匯總

 更新時(shí)間:2024年01月29日 11:45:21   作者:愛(ài)彈琴的牛  
Stream將要處理的元素集合看作一種流,在流的過(guò)程中借助Stream?API對(duì)流中的元素進(jìn)行操作,比如篩選、排序、聚合等,下面這篇文章主要給大家介紹了關(guān)于Java中Stream流Map分組方式的相關(guān)資料,需要的朋友可以參考下

前言

Stream是Java 8 API添加的一個(gè)新的抽象,稱為流Stream,以一種聲明性方式處理數(shù)據(jù)集合(側(cè)重對(duì)于源數(shù)據(jù)計(jì)算能力的封裝,并且支持序列與并行兩種操作方式)

Stream流是從支持?jǐn)?shù)據(jù)處理操作的源生成的元素序列,源可以是數(shù)組、文件、集合、函數(shù)。流不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它的主要目的在于計(jì)算

Stream流是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),與Lambda表達(dá)式結(jié)合,可以提高編程效率、間接性和程序可讀性。

java老式的分組方式(對(duì)list for循環(huán)然后 if判斷 放入map) 代碼復(fù)雜,易讀性差,維護(hù)性差,故本文匯總了Stream流中的分組方法供大家參考

(以下方法默認(rèn)都是java8的方法,java9新增方法有標(biāo)注)

List<Student> studentList = Arrays.asList(
new Student(1L,"小紅","籃球","紅色",22),
new Student(2L,"小白","足球","藍(lán)色",11),
new Student(3L,"小牛","足球","黑色",33),
new Student(4L,"小羊","足球","紅色",17),
new Student(5L,"小綠","足球","藍(lán)色",24));

1.常規(guī)按對(duì)象的字段直接將對(duì)象分組

按顏色分組

Map<String, List<Student>> byColor = studentList.stream()
.collect(groupingBy(Student::getColor));

打印Map結(jié)果:

{紅色=[Student{id=1, name='小紅', hobby='籃球', color='紅色', age=22}, Student{id=4, name='小羊', hobby='足球', color='紅色', age=17}],

藍(lán)色=[Student{id=2, name='小白', hobby='足球', color='藍(lán)色', age=11}, Student{id=5, name='小綠', hobby='足球', color='藍(lán)色', age=24}],

黑色=[Student{id=3, name='小牛', hobby='籃球', color='黑色', age=33}]}

2.對(duì)分組的條件(key)做定義將對(duì)象進(jìn)行分組

按年紀(jì)是否大于十八歲分組

Map<String, List<Student>> collect1 = studentList.stream().collect(groupingBy(key -> {
if (key.getAge() > 18) {
return "成年";
} else {
return "未成年";
}
}));

打印Map結(jié)果:

{未成年=[Student{id=2, name='小白', hobby='足球', color='藍(lán)色', age=11}, Student{id=4, name='小羊', hobby='足球', color='紅色', age=17}],

成年=[Student{id=1, name='小紅', hobby='籃球', color='紅色', age=22}, Student{id=3, name='小牛', hobby='籃球', color='黑色', age=33}, Student{id=5, name='小綠', hobby='足球', color='藍(lán)色', age=24}]}

3.在分組時(shí)對(duì)數(shù)據(jù)進(jìn)行過(guò)濾

過(guò)濾掉不想要的數(shù)據(jù)時(shí),在java8,需在分組前對(duì)集合進(jìn)行過(guò)濾,再分組。但會(huì)導(dǎo)致一類key中的元素都被過(guò)濾掉以后,分組結(jié)果不會(huì)有該key.

Map<String, List<Student>> collect = studentList.stream()
.filter(f->!"紅色".equals(f.getColor()))
.collect(groupingBy(Student::getColor));

打印Map結(jié)果:

{黑色=[Student{id=3, name='小牛', hobby='籃球', color='黑色', age=33}],

藍(lán)色=[Student{id=2, name='小白', hobby='足球', color='藍(lán)色', age=11}, Student{id=5, name='小綠', hobby='足球', color='藍(lán)色', age=24}]}

java9新增方法 filtering()方法,可以在分組時(shí)進(jìn)行過(guò)濾,以避免分組的結(jié)果map,因?yàn)檫^(guò)濾掉了一種key內(nèi)的所有元素導(dǎo)致map中沒(méi)有該key

filtering()

Map<String, List<Student>> collect = studentList.stream()
.collect(groupingBy(Student::getColor,
filtering(f->!"紅色".equals(f.getColor()),toList())));

打印Map結(jié)果:

{黑色=[Student{id=3, name='小牛', hobby='籃球', color='黑色', age=33}],

藍(lán)色=[Student{id=2, name='小白', hobby='足球', color='藍(lán)色', age=11}, Student{id=5, name='小綠', hobby='足球', color='藍(lán)色', age=24}],

紅色=[]}

4.在分組時(shí),將收集的對(duì)象映射處理為其他值

Map<String, List<String >> collect = studentList.stream()
.collect(groupingBy(Student::getColor,mapping(Student::getName,toList())));

打印Map結(jié)果:

{黑色=[小牛],

藍(lán)色=[小白, 小綠],

紅色=[小紅, 小羊]}

或?qū)apping()替換為其他方法對(duì)子組的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)處理,比如maxBy()求子組中的Optional(最大值),或collectingAndThen(maxBy(),Optional::get)去除外層的Optional,直接獲得最大值.

或者替換為求和,sumInt等

5.在分組時(shí),如果收集的value為list中包list,想將兩層list轉(zhuǎn)為一層,可使用flatmapping()方法

java9新增方法

和java8的flatmap()方法一樣,通過(guò)將需要收集的集合元素A收集到總集合B時(shí),將A中的單個(gè)集合轉(zhuǎn)為Stream,和B的Stream通過(guò)flatmap()方法,將中間A的Stream去掉,當(dāng)A中的單個(gè)集合中的元素都拿出來(lái)放到B中.

兩層

Map<String,List<List<String>>> 將兩層List拆開(kāi) Map<String,List<String>>

Map<String, List<List<String >>> collect = studentList.stream()
.collect(groupingBy(Student::getHobby,
mapping(m->colorToMindMap.get(m.getColor()),toList())));

Map<String, List<String >> collect = studentList.stream()
.collect(groupingBy(Student::getHobby,
flatMapping(f->colorToMindMap.get(f.getColor()).stream(),toList())));

6.多級(jí)分組

所謂多級(jí)分組,就是在groupingBy(a,b)的第二個(gè)參數(shù)繼續(xù)放groupingBy(a,b)方法.規(guī)則和原來(lái)一樣.

在平時(shí)用的groupingBy(Student::getColor)內(nèi)部調(diào)用的其實(shí)就是groupingBy(Student::getColor,toList()), toList()方法就代表著將元素按list的形式來(lái)存儲(chǔ)到對(duì)應(yīng)的key下,改成groupBy(a,b)就是以分組的方式繼續(xù)存儲(chǔ).

總結(jié)

到此這篇關(guān)于Java中Stream流Map分組方式的文章就介紹到這了,更多相關(guān)Java Stream流Map分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解

    Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解

    這篇文章主要介紹了Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java繼承的實(shí)現(xiàn)與繼承限制分析

    Java繼承的實(shí)現(xiàn)與繼承限制分析

    這篇文章主要介紹了Java繼承的實(shí)現(xiàn)與繼承限制,結(jié)合具體實(shí)例形式分析了Java繼承的定義、實(shí)現(xiàn)以及繼承的相關(guān)限制,需要的朋友可以參考下
    2019-01-01
  • 新手初學(xué)Java繼承、封裝與多態(tài)

    新手初學(xué)Java繼承、封裝與多態(tài)

    封裝、繼承、多態(tài)三大特征是java中比較常用的,務(wù)必要掌握,下面給大家介紹Java封裝、繼承、多態(tài)三大特征的理解,有不清楚的朋友可以一起學(xué)習(xí)下
    2021-07-07
  • Java線程同步的四種方式詳解

    Java線程同步的四種方式詳解

    這篇文章主要介紹了Java線程同步的四種方式詳解,需要的朋友可以參考下
    2023-02-02
  • idea新建文件后文件夾消失的問(wèn)題及解決

    idea新建文件后文件夾消失的問(wèn)題及解決

    這篇文章主要介紹了idea新建文件后文件夾消失的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring?EnableAsync注解異步執(zhí)行源碼解析

    Spring?EnableAsync注解異步執(zhí)行源碼解析

    這篇文章主要為大家介紹了Spring?EnableAsync注解源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解

    Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解

    這篇文章主要介紹了Mybatis Plugin攔截器開(kāi)發(fā)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • idea 無(wú)法創(chuàng)建Scala class 選項(xiàng)的原因分析及解決辦法匯總

    idea 無(wú)法創(chuàng)建Scala class 選項(xiàng)的原因分析及解決辦法匯總

    這篇文章主要介紹了idea 無(wú)法創(chuàng)建Scala class 選項(xiàng)的解決辦法匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    這篇文章主要給大家介紹了關(guān)于Spring boot中Jackson操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java設(shè)計(jì)模式的事件模型詳解

    Java設(shè)計(jì)模式的事件模型詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式的事件模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

大名县| 渭源县| 比如县| 独山县| 晋州市| 泰宁县| 泰来县| 宁晋县| 海淀区| 蓝田县| 陕西省| 长沙县| 西乡县| 聊城市| 黄大仙区| 巴青县| 翼城县| 东阳市| 天水市| 绥江县| 永仁县| 大埔区| 蛟河市| 天长市| 长顺县| 西和县| 广元市| 柞水县| 张掖市| 华亭县| 浮梁县| 兰坪| 永泰县| 吴桥县| 博客| 灵石县| 永寿县| 买车| 松阳县| 崇左市| 天峻县|