Java8如何利用Lambda快速生成map、多層嵌套map
利用Lambda快速生成map、多層嵌套map
List 轉(zhuǎn)為 Map<id, bean>
User
是List對象的元素,ListList
對象的變量名為:userListid
將作為 Map 的 Key
Map<String, User> idMap = userList.stream().collect( Collectors.toMap(User::getId, b->b) );
一主多子 javaBean List 轉(zhuǎn)為 Map<id, Map<id, itemBean> >
- 一主,主Bean: User
- 多子,子Bean: UserItem
- 集合:List
- 轉(zhuǎn)Map:Map<User_id, Map <UserItem_id, UserItem> >
一主多子的主javaBean為List對象的元素,List
此處List對象的變量為:userList
Map<String, Map<String, UserItem>> collect =? ?? ?userList.stream().collect( ?? ??? ?Collectors.toMap( ?? ??? ??? ?User::getId, b -> { ?? ??? ??? ??? ?return b.getUserItem().stream().collect( ?? ??? ??? ??? ??? ??? ?Collectors.toMap(UserItem::getId, c -> c) ?? ??? ??? ??? ?); ? ? ? ? ? ? } ? ? ? ? ) ? ? );
常見的代碼壞味道--多層嵌套,缺乏封裝
1. 多層嵌套
多層嵌套的兩個原因
1.1 if else
最簡單的重構(gòu)手法,提前 return ,也叫 Replace Nested Conditional with Guard Clauses 衛(wèi)語句。
有一些比較激進的看法認為 else 本身就是一種壞味道。
可以使用 idea 的插件 Checkstyle 檢查一下代碼的 圈復(fù)雜度。當(dāng)圈復(fù)雜度大于某個值的時候,就會報錯。
圈復(fù)雜度的這部分代碼中線性無關(guān)路徑的數(shù)量。
如果一段源碼中不包含控制流語句(條件或決策點),那么這段代碼的圈復(fù)雜度為1,因為這段代碼中只會有一條路徑;如果一段代碼中僅包含一個if語句,且if語句僅有一個條件,那么這段代碼的圈復(fù)雜度為2;包含兩個嵌套的if語句,或是一個if語句有兩個條件的代碼塊的圈復(fù)雜度為3。
第二種解決過多判斷的方案是多態(tài),這就要求從設(shè)計階段就開始考慮實現(xiàn)方案。
注意多態(tài)的本質(zhì)是想要實現(xiàn)對拓展開發(fā),對修改關(guān)閉,所以如果繼承的層級較多,邏輯比較復(fù)雜,就會導(dǎo)致適得其反的效果。
1.2 for 循環(huán)
對集合進行循環(huán)操作推薦使用java8的Stream操作(,mapreduce,map代表操作,collect代表reduce),比如。從本質(zhì)上講Stream也是循環(huán),但是這種語法糖的形式會對各種操作進行分類,進行合理的優(yōu)化處理。
循環(huán)和函數(shù)式編程的區(qū)別不僅僅在寫法上,更體現(xiàn)在思想上。前者描述實現(xiàn)細節(jié),后者描述做什么。
當(dāng)然,如果在列表轉(zhuǎn)換中使用過多的 lambda 表達式,會導(dǎo)致看起來很吃力,不好理解。這時候長的lambda本身可以提取成為方法。
2. 缺乏封裝
2.1. 過長的消息鏈或者說火車殘骸
第一種缺乏封裝的表現(xiàn)是java類處理不當(dāng),可能是設(shè)計的太粗糙,面向過程實現(xiàn)業(yè)務(wù)邏輯導(dǎo)致的。這就要求開發(fā)的時候進行更多的抽象。
比如,不是所有的java類都直接提供所有的getter setter 方法就行,還要根據(jù)業(yè)務(wù)場景進行合理選擇;另外對象內(nèi)部的細節(jié)不需要過多的暴露出去,應(yīng)該做適當(dāng)?shù)姆庋b。
2.2 基本類型的偏執(zhí)
第二種更高級的缺乏封裝,是指用基本類型代表所有的業(yè)務(wù)數(shù)據(jù)。比如
這是獲取價格的方法,返回一個 double 代表價格。 就算 double 可以保證計算精度,這里也還可以進一步優(yōu)化,比如,經(jīng)常要求商品價格是大于0的,所以會有下面的邏輯
這就是因為 double 作為基本類型并沒有 價格大于0 的方法。
這里的解決辦法,就是 Replace Primitive with Object ,以對象取代基本類型。
甚至有人認為需要封裝所有的基本類型和字符串,并且使用一流的集合。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證
Spring Security是一個可以為Java應(yīng)用程序提供全面安全服務(wù)的框架,同時它也可以輕松擴展以滿足自定義需求,本文主要介紹了SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證,感興趣的可以了解一下2023-11-11java 根據(jù)身份證號碼判斷出生日期、性別、年齡的示例
這篇文章主要介紹了java 根據(jù)身份證號碼判斷出生日期、性別、年齡的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-10-10Java并發(fā)之傳統(tǒng)線程同步通信技術(shù)代碼詳解
這篇文章主要介紹了Java并發(fā)之傳統(tǒng)線程同步通信技術(shù)代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02