亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2022年09月29日 10:00:25   作者:普通網(wǎng)友  
這篇文章主要介紹了Java8如何利用Lambda快速生成map、多層嵌套map問題,具有很好的參考價(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為List對(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)
?? ??? ??? ??? ?);
? ? ? ? ? ? }
? ? ? ? )
? ? );

常見的代碼壞味道--多層嵌套,缺乏封裝

1. 多層嵌套

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

1.1 if else

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

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

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

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

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

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

注意多態(tài)的本質(zhì)是想要實(shí)現(xiàn)對(duì)拓展開發(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),但是這種語法糖的形式會(huì)對(duì)各種操作進(jìn)行分類,進(jìn)行合理的優(yōu)化處理。

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

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

2. 缺乏封裝

2.1. 過長的消息鏈或者說火車殘骸

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

比如,不是所有的java類都直接提供所有的getter setter 方法就行,還要根據(jù)業(yè)務(wù)場景進(jìn)行合理選擇;另外對(duì)象內(nèi)部的細(xì)節(jié)不需要過多的暴露出去,應(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 作為基本類型并沒有 價(jià)格大于0 的方法。 

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

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

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

相關(guān)文章

  • MyBatis中的properties配置(推薦)

    MyBatis中的properties配置(推薦)

    這篇文章給大家介紹了MyBatis中的properties配置,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-12-12
  • Java深入探索單例模式的應(yīng)用

    Java深入探索單例模式的應(yīng)用

    單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式
    2022-06-06
  • Java實(shí)現(xiàn)分布式鎖的3種方法總結(jié)

    Java實(shí)現(xiàn)分布式鎖的3種方法總結(jié)

    分布式鎖是一種用于保證分布式系統(tǒng)中多個(gè)進(jìn)程或線程同步訪問共享資源的技術(shù),同時(shí)它又是面試中的常見問題,所以我們本文就重點(diǎn)來看分布式鎖的具體實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-09-09
  • 詳解SpringMVC 基礎(chǔ)教程 簡單入門實(shí)例

    詳解SpringMVC 基礎(chǔ)教程 簡單入門實(shí)例

    這篇文章主要介紹了詳解SpringMVC 基礎(chǔ)教程 簡單入門實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java設(shè)計(jì)模式之策略模式詳解

    Java設(shè)計(jì)模式之策略模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之策略模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證

    SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證

    Spring Security是一個(gè)可以為Java應(yīng)用程序提供全面安全服務(wù)的框架,同時(shí)它也可以輕松擴(kuò)展以滿足自定義需求,本文主要介紹了SpringBoot整合SpringSecurity和JWT和Redis實(shí)現(xiàn)統(tǒng)一鑒權(quán)認(rèn)證,感興趣的可以了解一下
    2023-11-11
  • java代碼實(shí)現(xiàn)C盤文件統(tǒng)計(jì)工具

    java代碼實(shí)現(xiàn)C盤文件統(tǒng)計(jì)工具

    今天周末,給大家分享基于java代碼實(shí)現(xiàn)C盤文件統(tǒng)計(jì)工具,在這小編使用的版本是Maven-3.9.9,jdk1.8,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • java 根據(jù)身份證號(hào)碼判斷出生日期、性別、年齡的示例

    java 根據(jù)身份證號(hào)碼判斷出生日期、性別、年齡的示例

    這篇文章主要介紹了java 根據(jù)身份證號(hào)碼判斷出生日期、性別、年齡的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • Java并發(fā)之傳統(tǒng)線程同步通信技術(shù)代碼詳解

    Java并發(fā)之傳統(tǒng)線程同步通信技術(shù)代碼詳解

    這篇文章主要介紹了Java并發(fā)之傳統(tǒng)線程同步通信技術(shù)代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java 繼承訪問成員變量代碼實(shí)例

    java 繼承訪問成員變量代碼實(shí)例

    這篇文章主要介紹了java 繼承訪問成員變量代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論