動(dòng)漫人物
2021-11-24 19:07:24
我有一個(gè)包含屬性名稱、公司和日期的對(duì)象列表。我想過(guò)濾該列表以根據(jù)日期獲取最新的名稱+公司組合。示例數(shù)據(jù):id | name | company | date---------------------- 1 | bob | A | 01/2017 2 | bob | A | 01/2016 3 | bob | A | 01/2015 4 | bob | B | 03/2017 5 | sal | B | 04/2018 6 | sue | A | 01/2016 7 | sue | A | 01/2017 8 | sue | A | 01/2015所需的結(jié)果應(yīng)該是一個(gè)包含 ids 的列表:1、4、5 和 7。如果名稱 + 公司組合不存在,我可以查看列表中的每個(gè)項(xiàng)目并將其添加到新列表中,如果存在,請(qǐng)檢查日期以查看是否應(yīng)替換現(xiàn)有的。但我覺(jué)得應(yīng)該有一種更簡(jiǎn)單的方法來(lái)通過(guò)流和過(guò)濾器來(lái)做到這一點(diǎn)。我就是想不出來(lái)怎么辦。搜索提供了諸如 Collections.max 之類的方法,但我想要一個(gè)基于組合的最大值列表。這些是 java 構(gòu)造的對(duì)象,而不是持久化的實(shí)體,否則我會(huì)做這樣的事情:GROUP BY with MAX(DATE)。但我想完成同樣的事情。是否可以使用過(guò)濾器來(lái)做到這一點(diǎn),還是我唯一的選擇是長(zhǎng)途?
1 回答

鳳凰求蠱
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您想使用 Collectors API 中的 groupingBy 方法。它允許您提供一個(gè)基于流中對(duì)象創(chuàng)建鍵的功能,然后為您提供 Map>。你會(huì)得到一個(gè)類似的代碼:
Function<YourObject, String> keyGen = o -> o.getName() + o.getCompany();
Comparator<YourObject> comp = (f1, f2) -> f1.date().compareTo(f2.getDate()
yourObjects.stream().collect(Collectors.groupingBy(keyGen)).values().stream().map(list -> Collections.max(list, comp)).map(MyObject::getId).collect(Collectors.toList());
添加回答
舉報(bào)
0/150
提交
取消