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

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

Groovy 數(shù)據(jù)重構(gòu):將列表中的Map按指定鍵分組并構(gòu)建父子結(jié)構(gòu)

DDD
發(fā)布: 2025-10-16 14:37:01
原創(chuàng)
588人瀏覽過

Groovy 數(shù)據(jù)重構(gòu):將列表中的Map按指定鍵分組并構(gòu)建父子結(jié)構(gòu)

本文將演示如何在 groovy 中高效地根據(jù)共同鍵(如 `coveragetype`)對 map 列表進行分組,并將其重構(gòu)為父子層級結(jié)構(gòu)。通過利用 groovy 強大的 `groupby` 和 `collect` 方法,文章將展示如何將每個唯一的鍵作為父級,并將其相關(guān)的項組織成子列表,從而實現(xiàn)清晰的數(shù)據(jù)組織。

在數(shù)據(jù)處理和轉(zhuǎn)換過程中,我們經(jīng)常會遇到這樣的需求:給定一個扁平化的數(shù)據(jù)列表,其中每個元素都是一個 Map,我們需要根據(jù)某個特定的鍵(例如,一個分類字段)將這些 Map 進行分組,并將屬于同一組的所有 Map 作為子項歸集到該組對應(yīng)的父項之下。這種數(shù)據(jù)重構(gòu)有助于提升數(shù)據(jù)的可讀性和組織性,尤其是在構(gòu)建報告或 API 響應(yīng)時。

初始數(shù)據(jù)結(jié)構(gòu)

假設(shè)我們有一個 fakeList,它包含了一系列保險覆蓋記錄,每條記錄都以 Map 的形式存儲,包含 coverageType、amount 和 expireDate 等信息:

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

我們的目標是根據(jù) coverageType 字段對這些記錄進行分組,并將其重構(gòu)為如下所示的父子層級結(jié)構(gòu):

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

Groovy 解決方案:利用 groupBy 和 collect

Groovy 提供了強大的集合操作方法,特別是 groupBy 和 collect,它們能夠以簡潔且高效的方式實現(xiàn)這種復(fù)雜的數(shù)據(jù)重構(gòu)。

1. 使用 groupBy 進行初步分組

首先,我們可以利用 groupBy 方法根據(jù) coverageType 鍵對 fakeList 中的元素進行分組。groupBy 方法會返回一個 Map,其中鍵是 coverageType 的唯一值,而對應(yīng)的值是包含所有匹配項的列表。

即構(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ù)智人
def groupedData = fakeList.groupBy { it.coverageType }
/*
  `groupedData` 的結(jié)構(gòu)將類似于:
  [
    health:[[coverageType:health, amount:9, expireDate:2020], [coverageType:health, amount:9, expireDate:2021]],
    insurance:[[coverageType:insurance, amount:10, expireDate:2020]]
  ]
*/
登錄后復(fù)制

2. 使用 collect 重構(gòu)為目標結(jié)構(gòu)

接下來,我們遍歷 groupedData 的每個鍵值對(即每個分組),并使用 collect 方法將其轉(zhuǎn)換為我們期望的父子結(jié)構(gòu)。對于每個分組,我們將分組的鍵(coverageType)作為新 Map 的 parent 字段的值,并將該分組下的所有原始項列表作為 children 字段的值。在構(gòu)建 children 列表時,我們可以選擇性地轉(zhuǎn)換數(shù)據(jù)類型(例如,將數(shù)字轉(zhuǎn)換為字符串)或調(diào)整子項內(nèi)部的鍵名。

def restructuredList = groupedData.collect { coverageType, items ->
    def parentMap = [:]
    parentMap.parent = coverageType
    parentMap.children = items.collect { item ->
        // 確保子項的數(shù)據(jù)類型和鍵名符合預(yù)期
        [
            coverageType: item.coverageType,
            amount: item.amount as String,     // 將數(shù)值轉(zhuǎn)換為字符串
            expireDate: item.expireDate as String // 將數(shù)值轉(zhuǎn)換為字符串
        ]
    }
    parentMap
}
登錄后復(fù)制

完整代碼示例

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

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

def restructuredList = fakeList.groupBy { it.coverageType }
                               .collect { coverageType, items ->
    def parentMap = [:]
    parentMap.parent = coverageType
    parentMap.children = items.collect { item ->
        // 根據(jù)需求調(diào)整子項的結(jié)構(gòu)和數(shù)據(jù)類型
        [
            coverageType: item.coverageType,
            amount: item.amount as String,
            expireDate: item.expireDate as String
        ]
    }
    parentMap
}

println restructuredList
登錄后復(fù)制

輸出結(jié)果

運行上述代碼,將得到以下符合預(yù)期的結(jié)構(gòu),其中父級鍵為 parent,子項列表鍵為 children,子項內(nèi)部鍵為 coverageType、amount 和 expireDate:

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

注意事項與最佳實踐

  • Groovy 集合方法的強大: groupBy 和 collect 是 Groovy 處理集合轉(zhuǎn)換的強大工具。它們提供了聲明式、簡潔的方式來表達復(fù)雜的數(shù)據(jù)操作,相比于傳統(tǒng)的循環(huán)和條件判斷,代碼更易讀、更高效。
  • 避免冗余的 Java Stream API: 盡管 Groovy 可以與 Java Stream API 互操作,但在 Groovy 環(huán)境中,通常有更簡潔、更符合 Groovy 習慣的集合操作方法,如本例所示,可以避免引入不必要的復(fù)雜性。
  • 數(shù)據(jù)類型轉(zhuǎn)換的靈活性: 在重構(gòu)數(shù)據(jù)時,經(jīng)常需要對原始數(shù)據(jù)進行類型轉(zhuǎn)換(例如,將數(shù)字 amount 和 expireDate 轉(zhuǎn)換為字符串)。Groovy 的 as 關(guān)鍵字提供了方便的類型轉(zhuǎn)換機制。
  • 結(jié)構(gòu)定制化: collect 閉包內(nèi)部提供了極大的靈活性,可以根據(jù)具體需求定制子項的結(jié)構(gòu),包括選擇性地包含或排除字段、重命名字段,甚至執(zhí)行更復(fù)雜的數(shù)據(jù)處理邏輯。

總結(jié)

本文詳細闡述了如何在 Groovy 中利用 groupBy 和 collect 這兩個核心集合方法,高效地將扁平化的 Map 列表重構(gòu)為具有父子層級關(guān)系的結(jié)構(gòu)。這種模式在處理聚合和轉(zhuǎn)換數(shù)據(jù)時非常實用,能夠顯著提高代碼的簡潔性、可讀性和維護性。掌握這些 Groovy 特性對于任何需要進行數(shù)據(jù)處理和轉(zhuǎn)換的開發(fā)者來說都至關(guān)重要。

以上就是Groovy 數(shù)據(jù)重構(gòu):將列表中的Map按指定鍵分組并構(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)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

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