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

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

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

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

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

  • User是List對(duì)象的元素,List
  • List對(duì)象的變量名為: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為L(zhǎng)ist對(duì)象的元素,List

此處List對(duì)象的變量為: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)
?? ??? ??? ??? ?);
? ? ? ? ? ? }
? ? ? ? )
? ? );

常見(jiàn)的代碼壞味道--多層嵌套,缺乏封裝

1. 多層嵌套

多層嵌套的兩個(gè)原因

1.1 if else

最簡(jiǎn)單的重構(gòu)手法,提前 return ,也叫 Replace Nested Conditional with Guard Clauses 衛(wèi)語(yǔ)句。

有一些比較激進(jìn)的看法認(rèn)為 else 本身就是一種壞味道。

可以使用 idea 的插件 Checkstyle 檢查一下代碼的 圈復(fù)雜度。當(dāng)圈復(fù)雜度大于某個(gè)值的時(shí)候,就會(huì)報(bào)錯(cuò)。

圈復(fù)雜度的這部分代碼中線性無(wú)關(guān)路徑的數(shù)量。

如果一段源碼中不包含控制流語(yǔ)句(條件或決策點(diǎn)),那么這段代碼的圈復(fù)雜度為1,因?yàn)檫@段代碼中只會(huì)有一條路徑;如果一段代碼中僅包含一個(gè)if語(yǔ)句,且if語(yǔ)句僅有一個(gè)條件,那么這段代碼的圈復(fù)雜度為2;包含兩個(gè)嵌套的if語(yǔ)句,或是一個(gè)if語(yǔ)句有兩個(gè)條件的代碼塊的圈復(fù)雜度為3。

第二種解決過(guò)多判斷的方案是多態(tài),這就要求從設(shè)計(jì)階段就開(kāi)始考慮實(shí)現(xiàn)方案。

注意多態(tài)的本質(zhì)是想要實(shí)現(xiàn)對(duì)拓展開(kāi)發(fā),對(duì)修改關(guān)閉,所以如果繼承的層級(jí)較多,邏輯比較復(fù)雜,就會(huì)導(dǎo)致適得其反的效果。

1.2 for 循環(huán)

對(duì)集合進(jìn)行循環(huán)操作推薦使用java8的Stream操作(,mapreduce,map代表操作,collect代表reduce),比如。從本質(zhì)上講Stream也是循環(huán),但是這種語(yǔ)法糖的形式會(huì)對(duì)各種操作進(jìn)行分類,進(jìn)行合理的優(yōu)化處理。

循環(huán)和函數(shù)式編程的區(qū)別不僅僅在寫法上,更體現(xiàn)在思想上。前者描述實(shí)現(xiàn)細(xì)節(jié),后者描述做什么。

當(dāng)然,如果在列表轉(zhuǎn)換中使用過(guò)多的 lambda 表達(dá)式,會(huì)導(dǎo)致看起來(lái)很吃力,不好理解。這時(shí)候長(zhǎng)的lambda本身可以提取成為方法。

2. 缺乏封裝

2.1. 過(guò)長(zhǎng)的消息鏈或者說(shuō)火車殘骸

第一種缺乏封裝的表現(xiàn)是java類處理不當(dāng),可能是設(shè)計(jì)的太粗糙,面向過(guò)程實(shí)現(xiàn)業(yè)務(wù)邏輯導(dǎo)致的。這就要求開(kāi)發(fā)的時(shí)候進(jìn)行更多的抽象。

比如,不是所有的java類都直接提供所有的getter setter 方法就行,還要根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行合理選擇;另外對(duì)象內(nèi)部的細(xì)節(jié)不需要過(guò)多的暴露出去,應(yīng)該做適當(dāng)?shù)姆庋b。

2.2 基本類型的偏執(zhí)

第二種更高級(jí)的缺乏封裝,是指用基本類型代表所有的業(yè)務(wù)數(shù)據(jù)。比如

這是獲取價(jià)格的方法,返回一個(gè) double 代表價(jià)格。 就算 double 可以保證計(jì)算精度,這里也還可以進(jìn)一步優(yōu)化,比如,經(jīng)常要求商品價(jià)格是大于0的,所以會(huì)有下面的邏輯

這就是因?yàn)?double 作為基本類型并沒(méi)有 價(jià)格大于0 的方法。 

這里的解決辦法,就是 Replace Primitive with Object ,以對(duì)象取代基本類型。

甚至有人認(rèn)為需要封裝所有的基本類型和字符串,并且使用一流的集合。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot vue項(xiàng)目后端列表接口分頁(yè)模糊查詢

    springboot vue項(xiàng)目后端列表接口分頁(yè)模糊查詢

    這篇文章主要為大家介紹了springboot vue項(xiàng)目后端列表接口分頁(yè)模糊查詢,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java數(shù)組去重復(fù)的18種方法示例

    Java數(shù)組去重復(fù)的18種方法示例

    這篇文章主要為大家介紹了Java數(shù)組去重復(fù)的18種寫法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot如何配置文件給bean賦值問(wèn)題

    SpringBoot如何配置文件給bean賦值問(wèn)題

    這篇文章主要介紹了SpringBoot如何配置文件給bean賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java多線程 實(shí)例解析

    Java多線程 實(shí)例解析

    這篇文章主要介紹了Java多線程 實(shí)例解析,需要的朋友可以參考下
    2017-04-04
  • Java編程調(diào)用微信接口實(shí)現(xiàn)圖文信息推送功能

    Java編程調(diào)用微信接口實(shí)現(xiàn)圖文信息推送功能

    這篇文章主要介紹了Java編程調(diào)用微信接口實(shí)現(xiàn)圖文信息等推送功能,涉及java微信圖文信息推送接口調(diào)用及相關(guān)文件、字符串編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 分布式消息隊(duì)列RocketMQ概念詳解

    分布式消息隊(duì)列RocketMQ概念詳解

    RocketMQ?是阿里開(kāi)源的分布式消息中間件,跟其它中間件相比,RocketMQ?的特點(diǎn)是純JAVA實(shí)現(xiàn),是一套提供了消息生產(chǎn),存儲(chǔ),消費(fèi)全過(guò)程API的軟件系統(tǒng),本文詳細(xì)介紹了分布式消息隊(duì)列RocketMQ概念,需要的朋友可以參考下
    2023-05-05
  • Java壓縮之LZW算法字典壓縮與解壓講解

    Java壓縮之LZW算法字典壓縮與解壓講解

    今天小編就為大家分享一篇關(guān)于Java壓縮之LZW算法字典壓縮與解壓講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 在java程序中使用protobuf

    在java程序中使用protobuf

    這篇文章主要介紹了protobuf的基本使用和同java結(jié)合的具體案例,感性興趣的小伙伴可以一起來(lái)閱讀下文
    2021-08-08
  • 了解Java多線程的可見(jiàn)性與有序性

    了解Java多線程的可見(jiàn)性與有序性

    這篇文章主要介紹了了解Java多線程的可見(jiàn)性與有序性,在Java內(nèi)存模型中,允許編譯器和處理器對(duì)指令進(jìn)行重排序,但是重排序過(guò)程不會(huì)影響到單線程程序的執(zhí)行,卻會(huì)影響到多線程并發(fā)執(zhí)行的正確性。,需要的朋友可以參考下
    2019-06-06
  • 詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    這篇文章主要介紹了詳解阿里云maven鏡像庫(kù)配置(gradle,maven),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論

溆浦县| 嘉荫县| 奉贤区| 布尔津县| 永川市| 肥东县| 怀化市| 施甸县| 柞水县| 武宁县| 安溪县| 浮梁县| 怀远县| 黄冈市| 庐江县| 疏勒县| 汾西县| 枝江市| 阳山县| 昆明市| 宁晋县| 会同县| 同江市| 石棉县| 祥云县| 沾益县| 黎城县| 区。| 丹东市| 延寿县| 镶黄旗| 石林| 姜堰市| 宜良县| 河北省| 平和县| 揭西县| 芷江| 高青县| 井陉县| 景泰县|