亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > Java > java教程 > 正文

Groovy數(shù)據(jù)重塑:將扁平列表按鍵分組并構(gòu)建嵌套結(jié)構(gòu)

聖光之護
發(fā)布: 2025-10-16 12:47:00
原創(chuàng)
131人瀏覽過

Groovy數(shù)據(jù)重塑:將扁平列表按鍵分組并構(gòu)建嵌套結(jié)構(gòu)

本文深入探討了如何利用groovy的強大集合方法,特別是`groupby`和`collect`,將一個扁平的map列表高效地轉(zhuǎn)換為具有父子層級結(jié)構(gòu)的嵌套列表。通過一個具體的示例,文章詳細演示了如何根據(jù)共同的鍵(如`coveragetype`)對數(shù)據(jù)進行分組,并進一步重構(gòu)每個分組,生成包含父級標識和子級詳細信息的新結(jié)構(gòu),從而實現(xiàn)復(fù)雜的數(shù)據(jù)重塑需求。

引言:數(shù)據(jù)重塑的挑戰(zhàn)

在數(shù)據(jù)處理和轉(zhuǎn)換中,我們經(jīng)常會遇到將扁平化的數(shù)據(jù)結(jié)構(gòu)重塑為更具組織性和層次感的需求。例如,一個包含多個獨立記錄的列表,我們可能需要根據(jù)某個共同的屬性將這些記錄分組,并將其組織成一個父子(或主從)結(jié)構(gòu)。傳統(tǒng)的迭代和條件判斷方法可能導(dǎo)致代碼冗長且效率低下。Groovy作為一種動態(tài)語言,提供了豐富的集合操作方法,能夠以簡潔、聲明式的方式解決這類數(shù)據(jù)重塑問題。

假設(shè)我們有一個fakeList,其中包含多個保險覆蓋類型的記錄:

def fakeList = [
    [coverageType: 'health', amount: 9, expireDate: 2020], 
    [coverageType: 'insurance', amount: 10, expireDate: 2020], 
    [coverageType: 'health', amount: 9, expireDate: 2021],
] 
登錄后復(fù)制

我們的目標是將這個列表轉(zhuǎn)換為以下結(jié)構(gòu):

[
    [parent: 'health',
     childs: [
        [coverage: 'health', amount: '9', expireDate: '2020'],
        [coverage: 'health', amount: '9', expireDate: '2021'],
     ]
    ],
    [parent: 'insurance',
     childs: [
        [coverage: 'insurance', amount: '10', expireDate: '2020']
     ]
    ]
]
登錄后復(fù)制

這種結(jié)構(gòu)將所有coverageType相同的記錄歸入同一個parent下,并作為其childs列表的元素。

Groovy解決方案核心:groupBy與collect

Groovy的groupBy和collect是實現(xiàn)這種數(shù)據(jù)重塑的關(guān)鍵工具。groupBy用于將集合中的元素根據(jù)某個屬性進行分組,而collect則用于對集合中的每個元素進行轉(zhuǎn)換,生成一個新的集合。

第一步:基于共同屬性進行分組

首先,我們使用groupBy方法將fakeList中的元素根據(jù)coverageType屬性進行分組。groupBy方法會返回一個Map,其中鍵是分組的依據(jù)(coverageType的值),值是符合該鍵的所有原始元素的列表。

def groupList = fakeList.groupBy { it.coverageType }
登錄后復(fù)制

執(zhí)行上述代碼后,groupList的結(jié)構(gòu)將大致如下:

// groupList 的中間結(jié)果
[
    'health': [
        [coverageType: 'health', amount: 9, expireDate: 2020], 
        [coverageType: 'health', amount: 9, expireDate: 2021]
    ],
    'insurance': [
        [coverageType: 'insurance', amount: 10, expireDate: 2020]
    ]
]
登錄后復(fù)制

第二步:重構(gòu)分組后的數(shù)據(jù)為父子結(jié)構(gòu)

接下來,我們對groupList這個Map進行迭代,并使用collect方法將其轉(zhuǎn)換為我們期望的父子結(jié)構(gòu)列表。collect方法接受一個閉包,該閉包對Map的每個條目(鍵值對)進行處理,并返回一個新的元素。

即構(gòu)數(shù)智人
即構(gòu)數(shù)智人

即構(gòu)數(shù)智人是由即構(gòu)科技推出的AI虛擬數(shù)字人視頻創(chuàng)作平臺,支持數(shù)字人形象定制、短視頻創(chuàng)作、數(shù)字人直播等。

即構(gòu)數(shù)智人36
查看詳情 即構(gòu)數(shù)智人

構(gòu)建父級元素

在collect的閉包中,我們可以訪問到每個分組的coverageType(作為coverageType參數(shù))和對應(yīng)的原始項目列表(作為items參數(shù))。我們可以創(chuàng)建一個新的Map來表示父級結(jié)構(gòu),其中parent鍵對應(yīng)coverageType。

// ... 承接上文的 groupList
.collect { coverageType, items ->
    def map = [:]
    map.'parent' = coverageType 
    // ... 接下來構(gòu)建 childs
}
登錄后復(fù)制

構(gòu)建子級元素

對于每個父級結(jié)構(gòu),其childs鍵的值應(yīng)該是一個列表,包含所有屬于該coverageType的原始項目。我們需要再次使用collect方法,遍歷items列表,將每個原始Map轉(zhuǎn)換為我們期望的子級Map格式。

// ... 承接上文的 map.'parent' = coverageType
    map.'childs' = items.collect { item ->
        def childMap = [:]
        childMap.'coverage' = coverageType // 或者 item.coverageType
        childMap.'amount' = item.amount as String // 注意類型轉(zhuǎn)換
        childMap.'expireDate' = item.expireDate as String // 注意類型轉(zhuǎn)換
        childMap
    }
    map // 返回完整的父子結(jié)構(gòu)Map
}
登錄后復(fù)制

這里需要注意的是,我們對amount和expireDate進行了as String的類型轉(zhuǎn)換,以確保輸出格式與預(yù)期一致。

完整示例代碼

將上述步驟整合起來,完整的Groovy代碼如下:

def fakeList = [
    [coverageType: 'health', amount: 9, expireDate: 2020], 
    [coverageType: 'insurance', amount: 10, expireDate: 2020], 
    [coverageType: 'health', amount: 9, expireDate: 2021],
] 

def groupList = fakeList.groupBy { it.coverageType }
                        .collect { coverageType, items ->
    def map = [:]
    map.'parent' = coverageType 
    map.'childs' = items.collect { item ->
        def childMap = [:]
        childMap.'coverage' = coverageType // 保持與父級一致,或使用 item.coverageType
        childMap.'amount' = item.amount as String // 將數(shù)字轉(zhuǎn)換為字符串
        childMap.'expireDate' = item.expireDate as String // 將數(shù)字轉(zhuǎn)換為字符串
        childMap
    }
    map
}

println groupList
登錄后復(fù)制

輸出結(jié)果解析

運行上述代碼,將得到以下結(jié)果:

[
    [parent:health, childs:[[coverage:health, amount:9, expireDate:2020], [coverage:health, amount:9, expireDate:2021]]],
    [parent:insurance, childs:[[coverage:insurance, amount:10, expireDate:2020]]]
]
登錄后復(fù)制

這個結(jié)果精確地匹配了我們預(yù)期的父子層級結(jié)構(gòu),每個coverageType都成為了一個parent,其下方的childs列表包含了所有相關(guān)的原始記錄,并按照指定的格式進行了轉(zhuǎn)換。

注意事項與最佳實踐

  1. 類型轉(zhuǎn)換: 在構(gòu)建子級元素時,如果原始數(shù)據(jù)類型與目標類型不符(例如,原始是Integer,目標是String),請務(wù)必進行顯式轉(zhuǎn)換,如item.amount as String。
  2. 鍵名選擇: parent和childs(或children)的鍵名可以根據(jù)實際需求自由定義。
  3. 子元素結(jié)構(gòu): 子元素內(nèi)部的鍵值對也可以根據(jù)需要進行調(diào)整。如果希望子元素不帶鍵(例如,['health', '9', '2020']),則可以將childMap的構(gòu)建邏輯改為直接返回一個列表:
    map.'childs' = items.collect { item ->
        [item.coverageType, item.amount as String, item.expireDate as String]
    }
    登錄后復(fù)制
  4. Groovy集合方法的鏈式調(diào)用: Groovy的集合方法支持鏈式調(diào)用,使得代碼更加緊湊和易讀。groupBy之后直接跟collect是其典型應(yīng)用。
  5. 閉包的強大: Groovy的閉包是其核心特性之一,它們使得集合操作變得極其靈活和富有表現(xiàn)力。

總結(jié)

通過結(jié)合使用Groovy的groupBy和collect方法,我們可以優(yōu)雅且高效地解決復(fù)雜的數(shù)據(jù)重塑問題。這種聲明式的編程風(fēng)格不僅使代碼更簡潔,也提高了其可讀性和可維護性。掌握這些強大的集合操作,是成為一名高效Groovy開發(fā)者的關(guān)鍵一步。在處理類似將扁平數(shù)據(jù)轉(zhuǎn)換為層次結(jié)構(gòu)的需求時,優(yōu)先考慮利用Groovy提供的這些內(nèi)置功能,將大大提升開發(fā)效率和代碼質(zhì)量。

以上就是Groovy數(shù)據(jù)重塑:將扁平列表按鍵分組并構(gòu)建嵌套結(jié)構(gòu)的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號