如何用Java Stream寫出既高雅又裝*的代碼
List<String> strings = Lists.newArrayList("name=kk", "sex=1", "tel=1111", "email=xx@qq.com","name=ww","name=yy");
一. 冷靜分析
如上代碼,你現(xiàn)在要做一個(gè)分組的Map將上面list的值讀取出來,然后分組統(tǒng)計(jì)類似于Map<String,List< String >> 將Key相同的Val全部存到一個(gè)list里面
二. 直接開裝
不會(huì)真有人還直接遍歷吧,那別人不就看的懂了~ 為了炫技直接裝一波
定義封裝對(duì)象
@Data @Builder static class ObiectMap{ private String key; private String value; }
2.1 初級(jí)炫
System.out.println("map1: "); Map<String, List<String>> collect1 = strings.stream().map(e -> { //封裝成對(duì)象 String[] split = e.split("\\=", 2); return ObiectMap.builder().key(split[0]).value(split[1]).build(); }).collect(Collectors.toMap(ObiectMap::getKey,v->Lists.newArrayList(v.getValue()), (List<String> newList, List<String> oldList) -> { // Collectors.toMap(a,b,(n1,n2)) -> a代表Map的key (這里直接用方法引用拿到key) b代表value (n1,n2)代表key相同時(shí)value的處理辦法,直接合并List oldList.addAll(newList); return oldList; })); collect1.forEach((k,v)->{ System.out.printf(k+" { "); String vList = v.stream().collect(Collectors.joining(",")); //加上逗號(hào),最后一個(gè)不加 System.out.printf(vList); System.out.printf(" }"); System.out.println(); }); System.out.println();
結(jié)果如下
2.2 普通炫
System.out.println("map2: "); Map<String, List<String>> collect2 = strings.stream().map(e -> { String[] split = e.split("\\=", 2); return ObiectMap.builder().key(split[0]).value(split[1]).build(); }).collect(Collectors.groupingBy(ObiectMap::getKey, Collectors.mapping(ObiectMap::getValue, Collectors.toList()))); //Collectors.groupingBy(a,b) a還是通過key來分組 ,b將value收集起來做list value collect2.forEach((k,v)->{ System.out.printf(k+" { "); String vList = v.stream().collect(Collectors.joining(",")); //加上逗號(hào),最后一個(gè)不加 System.out.printf(vList); System.out.printf(" }"); System.out.println(); }); System.out.println();
結(jié)果如下
2.3 高級(jí)炫
用Guava來炫
import com.google.common.collect.*
System.out.println("map3: get name List with Multimap"); List<ObiectMap> collect3 = strings.stream().map(e -> { String[] split = e.split("\\=", 2); return ObiectMap.builder().key(split[0]).value(split[1]).build(); }).collect(Collectors.toList()); Multimap<String, String> multiMap = ArrayListMultimap.create(); //使用Guava的Multimap來存 value直接是collection,可以隨意轉(zhuǎn)換 collect3.forEach(c -> multiMap.put(c.getKey(), c.getValue())); System.out.println(multiMap.get("name").stream().collect(Collectors.joining(","))); System.out.println();
結(jié)果如下
2.4 再炫一波 拿到當(dāng)前key與對(duì)應(yīng)的數(shù)量
System.out.println("map4: get name with count"); Map<String, Long> collect4 = strings.stream().map(e -> { String[] split = e.split("\\=", 2); return ObiectMap.builder().key(split[0]).value(split[1]).build(); }).collect(Collectors.groupingBy(ObiectMap::getKey, Collectors.counting())); // 拿到數(shù)量 collect4.forEach((k,v)->{ System.out.printf(k+" { "); System.out.printf("%d",v); System.out.printf(" }"); System.out.println(); }); System.out.println();
結(jié)果如下
2.5 Map Reduce炫
這個(gè)不能處理重復(fù)value,只是將單一Map聚合到一個(gè)Map
List<String> strings = Lists.newArrayList("name=kk", "sex=1", "tel=1111", "email=xx@qq.com"); Map<String, String> reduce = strings.stream().map(e -> { String[] split = e.split("\\=", 2); // 正則劃分為單map return Collections.singletonMap(split[0], split[1]); }).reduce(new HashMap<String, String>(), (accMap, singleMap) -> { // reduce(a,(b,c))-> a 為初始值 b為累加值 c為當(dāng)前值 操作返回當(dāng)前值與累加值后的結(jié)果 將多個(gè)單KV的Map組合成一個(gè)Map accMap.putAll(singleMap); return accMap; }); reduce.forEach((k,v)->{ System.out.println(k+" = "+v); });
好家伙直接裝一波,直接起飛~ 制作不易,轉(zhuǎn)載請(qǐng)標(biāo)注
到此這篇關(guān)于如何用Java Stream寫出既高雅又裝*的代碼的文章就介紹到這了,更多相關(guān)Java Stream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一篇文章帶你了解Java Stream流
- Java之OutputStreamWriter流案例詳解
- 手把手帶你了解Java-Stream流方法學(xué)習(xí)及總結(jié)
- Java FileInputStream與FileOutputStream使用詳解
- Java inputstream和outputstream使用詳解
- JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourceAsStream()的區(qū)別
- 基于Java8并行流(parallelStream)的注意點(diǎn)
- Java8的Stream()與ParallelStream()的區(qū)別說明
- java8 使用stream排序空字段排在前面或后面
- 總結(jié)一下關(guān)于在Java8中使用stream流踩過的一些坑
- 解析Java8 Stream原理
- Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問題小結(jié)
- java8 Stream list to Map key 重復(fù) value合并到Collectio的操作
- 關(guān)于JAVA8的 Stream學(xué)習(xí)
相關(guān)文章
java方法重寫和super關(guān)鍵字實(shí)例詳解
這篇文章主要介紹了java方法重寫和super關(guān)鍵字實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03java實(shí)現(xiàn)收藏名言語句臺(tái)詞的app
本文給大家分享的是使用java制作的記錄名人名言臺(tái)詞等等讓你難忘的語句的APP的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2015-04-04基于Hutool的圖片驗(yàn)證碼功能模塊實(shí)現(xiàn)
為了提高系統(tǒng)的安全性,防止接口被暴力刷新,驗(yàn)證碼是個(gè)好的手段,圖片驗(yàn)證碼沒有短信驗(yàn)證碼的費(fèi)用,其是個(gè)人開發(fā)者學(xué)習(xí)的重點(diǎn),這篇文章主要介紹了基于Hutool的圖片驗(yàn)證碼功能模塊實(shí)現(xiàn),需要的朋友可以參考下2022-10-10Java中泛型學(xué)習(xí)之細(xì)節(jié)篇
泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Java中泛型細(xì)節(jié)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02SpringBoot執(zhí)行異步任務(wù)Async介紹
這篇文章主要為大家介紹了SpringBoot執(zhí)行異步任務(wù)Async示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot集成Shiro進(jìn)行權(quán)限控制和管理的示例
這篇文章主要介紹了SpringBoot集成Shiro進(jìn)行權(quán)限控制和管理的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03