欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8如何利用Lambda快速生成map、多層嵌套map

 更新時間:2022年09月29日 10:00:25   作者:普通網(wǎng)友  
這篇文章主要介紹了Java8如何利用Lambda快速生成map、多層嵌套map問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

利用Lambda快速生成map、多層嵌套map

List 轉(zhuǎn)為 Map<id, bean>

  • User是List對象的元素,List
  • List對象的變量名為:userList
  • id 將作為 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)文章

最新評論