我被阻止使用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)));
添加回答
舉報
0/150
提交
取消