Java 8中引入了新的Stream API,它具有流式計算的特性,可以對集合、數組等數據進行處理和計算。其中,Stream的toMap()方法可以將流中的元素轉化為Map,本文將從以下方面對如何使用Java 8的Stream將數據轉化為Map進行詳細闡述。
一、創建HashMap並初始化
轉化為Map前,需要創建Map對象並初始化,Java 8中提供了一個靜態方法可以創建Map,即Map.of()。但使用Map.of()方法有一個前提,它只適用於小型Map的初始化,如果需要初始化大型Map或一個Map中有多個相同的key,需要使用HashMap來初始化。
使用HashMap初始化,可以先創建Map對象,再使用put()方法為Map添加元素:
Map<String, String> map = new HashMap<>(); map.put("key1", "value1"); map.put("key2", "value2");
二、使用Stream將List轉化為Map
使用Java 8的Stream將List轉化為Map時,需要指定key和value,可以通過lambda表達式來完成:
List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20)); personList.add(new Person("Jerry", 22)); Map<String, Integer> nameToAgeMap = personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
上面的代碼中,創建了一個Person類,包含姓名和年齡兩個屬性,然後將Person對象放入List中。使用stream()方法生成Stream對象,再使用collect()方法並指定toMap()方法,根據getName()方法生成key,根據getAge()方法生成value,最終得到Map<String, Integer>類型的nameToAgeMap。
三、使用Stream將List轉化為多個value的Map
如果需要將List轉化為一個key對應多個value的Map,可以使用toMap()的第三個參數實現:
List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20)); personList.add(new Person("Jerry", 20)); Map<String, List<Person>> ageToPersonListMap = personList.stream().collect(Collectors.toMap(Person::getAge, p -> new ArrayList<>(Arrays.asList(p)), (oldList, newList) -> { oldList.addAll(newList); return oldList; }));
在toMap()方法中,除了getKeyMapper()和getValueMapper()外,還需要提供一個函數來處理key重複(多個對象的key值相同)的情況,上述代碼中,通過第三個參數解決問題。第三個參數為一個函數式接口,用於合併兩個值,返回的是合併後的值,這裡使用了lambda表達式來完成。
四、使用Stream將數組轉化為Map
使用Java 8的Stream將數組轉化為Map時,需要先將數組轉化為Stream對象:
String[] words = {"hello", "world", "i", "am", "a", "bot"}; Map<String, Integer> wordLengthMap = Arrays.stream(words).collect(Collectors.toMap( w -> w, w -> w.length(), (oldValue, newValue) -> oldValue, HashMap::new));
上述代碼中,使用Arrays.stream()方法將數組轉化為Stream對象,再使用toMap()方法,key和value分別為數組元素和元素的長度。第三個參數同樣為處理key重複情況的函數,使用HashMap作為返回的Map類型。
五、使用Stream將List轉化為Map,value為對象
假設有一個List,需要將List中的某一個屬性作為key,整個對象作為value生成一個Map:
List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20)); personList.add(new Person("Jerry", 22)); Map<String, Person> nameToPersonMap = personList.stream().collect(Collectors.toMap(Person::getName, p -> p));
上述代碼中,使用toMap()方法時,getValueMapper()使用lambda表達式直接將整個Person對象作為value,當然也可以指定一個返回值為Person類型的方法。
結束語
通過Java 8中的Stream API,並結合lambda表達式等特性,可以方便地將List和數組等數據轉化為Map,極大地提高了編程效率,使代碼更加簡潔、優雅。本文介紹了5種將數據轉化為Map的方法,可以根據實際需求選擇使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/259345.html