一、Stream介紹
在介紹如何將Java Stream轉換為Map之前,我們需要先了解一下Java Stream是什麼。
Java Stream是Java 8中新增的一個API,用於對集合、數組等數據進行處理和操作。Stream提供了一種類似於流水線的處理方式,使得代碼更加簡潔、易讀。
Stream分為中間操作和終止操作兩種,中間操作會返回一個新的Stream對象,終止操作會返回一個結果,例如在將Stream轉換為Map時需要使用到的collect方法。
二、將Stream轉換為Map
在Java編程中,我們經常需要將一個集合轉換為Map,Stream提供了一種簡單的方式來實現這個功能。
1、將List轉換為Map
List users = Arrays.asList(new User("Tom", 18), new User("Jerry", 20), new User("Lucy", 22)); Map userMap = users.stream().collect(Collectors.toMap(User::getName, Function.identity()));
在上面的代碼示例中,我們首先創建了一個包含三個User對象的List集合。然後使用Stream的collect方法將List轉換為Map對象,其中第一個參數是要作為鍵值的屬性(這裡是name),第二個參數是一個Function對象,用於將List中的元素轉換為Map中的value。
2、將數組轉換為Map
User[] users = new User[]{new User("Tom", 18), new User("Jerry", 20), new User("Lucy", 22)}; Map userMap = Arrays.stream(users).collect(Collectors.toMap(User::getName, Function.identity()));
如果要將數組轉換為Map,則需要先使用Arrays類的stream方法將數組轉換為Stream對象,然後再使用collect方法將Stream轉換為Map對象。
3、解決鍵值重複問題
在將Stream轉換為Map時,如果存在兩個元素具有相同的鍵,就會拋出一個IllegalStateException異常。
List users = Arrays.asList(new User("Tom", 18), new User("Jerry", 20), new User("Tom", 22)); Map userMap = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (oldValue, newValue) -> newValue));
為了解決鍵值重複問題,可以在collect方法的第三個參數中傳入一個函數(在上述示例中為(oldValue, newValue) -> newValue),該函數定義了當鍵值重複時應該如何處理,例如我們可以選擇保留新的value或者保留舊的value。
三、使用Stream的特殊類型轉換為Map
Stream中還有一些特殊類型,例如IntStream、LongStream和DoubleStream,我們也可以將它們轉換為Map。
1、將IntStream轉換為Map
int[] ages = {18, 20, 22}; Map ageMap = Arrays.stream(ages).boxed().collect(Collectors.toMap(Function.identity(), age -> age * 2));
在將IntStream轉換為Map時,需要先使用boxed方法將IntStream轉換為Stream<Integer>類型,然後再調用collect方法轉換為Map類型。
2、將對象屬性轉換為Map
List users = Arrays.asList(new User("Tom", 18), new User("Jerry", 20), new User("Lucy", 22)); Map ageMap = users.stream().collect(Collectors.toMap(User::getName, User::getAge));
在將對象屬性轉換為Map時,只需要使用對象的屬性作為鍵值,將屬性的值作為Map的value即可。
四、總結
Java Stream提供了一種簡單的方式將集合、數組等數據類型轉換為Map。在使用Stream的collect方法將Stream轉換為Map時,需要注意鍵值重複的問題,並在第三個參數中傳入一個函數來解決該問題。
原創文章,作者:IJTPA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332545.html