亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Collectors 制作 Map of Map

如何使用 Collectors 制作 Map of Map

慕后森 2022-12-15 10:52:22
我被阻止使用Java 函數式編程來構建地圖。在我的用例中,這只是一個例子,我想構建一個Map<Integer, Map<Integer, List<Person>>>從List<Person>.第一步很簡單:我首先構建一個Map<Integer, List<person>>.然后我想添加一個新的分組級別,以便生成一個新的 Map : Map<Integer, Map<Integer, List<person>>>。重點是:如何正確使用所有 Collectors 功能(groupingBy、映射,也許還有其他功能)來添加新的分組級別?我所有的嘗試都失敗了:編譯器總是告訴我我提供的所有函數都不符合它的預期。這是代碼,簡要地說:首先是一個 Person 類,然后是一個快速構建 List 的方法:public class Person {  private long id;  privae String firstName;  private String lastName;  private Date birthDate;  private int alea;  ...此方法(位于 DataBuilder 類中)僅構建一個 Person 列表以向 Main 類提供數據:public List<Person> getPersons() {        List<Person> persons = new ArrayList<>();        Supplier<Person> person = Person::new;        for (int cpt = 0; cpt < 10; cpt++) {            Person p = person.get();            p.setId(cpt);            p.setFirstName("fn" + cpt);            p.setLastName("ln" + cpt);            p.setBirthDate(new Date(119, cpt, 10 + cpt));            p.setAlea(cpt % 2);            persons.add(p);        }        return persons;    }在 Main 中,構建第一層 Map 不是問題:public static void main(String[] args) {    DataBuilder db = new DataBuilder();    List<Person> persons = db.getPersons();    Map<Integer, List<Person>> mapAleaPerson = persons.stream()                .collect(Collectors.groupingBy(Person::getAlea,                        Collectors.mapping(p -> p, Collectors.toList())));        mapAleaPerson.forEach((k,v) -> System.out.printf("%n%s contains %s%n", k, v));結果在控制臺中正常:0 contains [Person [id=0, firstName=fn0, lastName=ln0, alea=0], Person [id=2, firstName=fn2, lastName=ln2, alea=0], Person [id=4, firstName=fn4, lastName=ln4, alea=0], Person [id=6, firstName=fn6, lastName=ln6, alea=0], Person [id=8, firstName=fn8, lastName=ln8, alea=0]]現在我想添加一個新的分組級別。我選擇了 BirthDate 的年份,這是 Person 對象的另一個屬性。每次編譯器都會因為不兼容的 Function 類型而返回錯誤。我發現添加新分組級別的唯一方法是使用舊的 Java 代碼和外部循環在 Map 的 Map 中添加和分組數據。在舊 Java 中嵌入 FP 令人失望!!有人知道用純 FP 做所有這些嗎?真正令人驚訝的是,groupingBy與構建第一個 Map 本身的方式相比,嵌套語句的簡單性。為什么我們不再需要指定mappingandCollectors.toList()了?
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

使用嵌套groupingBy

Map<Integer,Map<Integer,List<Person>>> mapByYearThenAleaPerson = 
    persons.stream()
           .collect(Collectors.groupingBy(p -> p.getBirthDate().getYear(),
                                          Collectors.groupingBy(Person::getAlea)));


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號