本文將演示如何在 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è)我們有一個 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], ]
我們的目標是根據(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'] ] ] ]
Groovy 提供了強大的集合操作方法,特別是 groupBy 和 collect,它們能夠以簡潔且高效的方式實現(xiàn)這種復(fù)雜的數(shù)據(jù)重構(gòu)。
首先,我們可以利用 groupBy 方法根據(jù) coverageType 鍵對 fakeList 中的元素進行分組。groupBy 方法會返回一個 Map,其中鍵是 coverageType 的唯一值,而對應(yīng)的值是包含所有匹配項的列表。
即構(gòu)數(shù)智人是由即構(gòu)科技推出的AI虛擬數(shù)字人視頻創(chuàng)作平臺,支持數(shù)字人形象定制、短視頻創(chuàng)作、數(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]] ] */
接下來,我們遍歷 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 }
將上述步驟整合,得到完整的 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
運行上述代碼,將得到以下符合預(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]]] ]
本文詳細闡述了如何在 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)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號