您需要了解的高階 Java Stream 技巧
1. 建立映射來快取實體
在 Map 中快取實體可以透過減少從資料庫或其他資料來源重複獲取資料的需要來提高效能。使用Java Streams,您可以輕鬆建立這樣的快取。
範例程式碼
import java.util.List; import java.util.Map; import java.util.stream.Collectors; class User { private int id; private String name; // Constructors, getters, setters } public class EntityCacheExample { public static void main(String[] args) { List<User> users = List.of( new User(1, "Alice"), new User(2, "Bob"), new User(3, "Charlie") ); Map<Integer, User> userCache = users.stream() .collect(Collectors.toMap(User::getId, user -> user)); System.out.println(userCache); } }
在上面的程式碼中,我們使用 Collectors.toMap() 將 User 物件清單轉換為 Map,其中鍵是使用者的 ID,值是 User 物件本身。這有效地創建了用戶實體的快取。
示範結果
{1=User{id=1, name='Alice'}, 2=User{id=2, name='Bob'}, 3=User{id=3, name='Charlie'}}
2. 建立嵌套映射
當您需要將資料分類為多個層級時,巢狀對應非常有用。例如,您可能希望按部門然後按角色對使用者進行分組。
範例程式碼
import java.util.List; import java.util.Map; import java.util.stream.Collectors; class User { private String department; private String role; private String name; // Constructors, getters, setters } public class NestedMapExample { public static void main(String[] args) { List<User> users = List.of( new User("HR", "Manager", "Alice"), new User("IT", "Developer", "Bob"), new User("IT", "Manager", "Charlie") ); Map<String, Map<String, List<User>>> nestedMap = users.stream() .collect(Collectors.groupingBy(User::getDepartment, Collectors.groupingBy(User::getRole))); System.out.println(nestedMap); } }
此程式碼示範如何使用 Collectors.groupingBy() 建立巢狀 Map。外部 Map 依部門將使用者分組,而內部 Map 進一步依角色分組使用者。
示範結果
{HR={Manager=[User{name='Alice'}]}, IT={Developer=[User{name='Bob'}], Manager=[User{name='Charlie'}]}}
3. 建立具有兩個值的映射
有時,您可能想要在 Map 中儲存單一鍵的多個屬性。使用地圖
>
可能是個有效的解決方案。
範例程式碼
import java.util.List; import java.util.Map; import java.util.AbstractMap.SimpleEntry; import java.util.stream.Collectors; class User { private int id; private String name; private int age; // Constructors, getters, setters } public class MapWithTwoValuesExample { public static void main(String[] args) { List<User> users = List.of( new User(1, "Alice", 30), new User(2, "Bob", 25), new User(3, "Charlie", 35) ); Map<Integer, Map.Entry<String, Integer>> userMap = users.stream() .collect(Collectors.toMap(User::getId, user -> new SimpleEntry<>(user.getName(), user.getAge()))); System.out.println(userMap); } }
在這裡,我們使用 SimpleEntry 建立一個 Map,其中包含與每個使用者 ID 關聯的兩個值(姓名和年齡)。
示範結果
{1=Alice=30, 2=Bob=25, 3=Charlie=35}
4. 分組依據與映射
分組和映射在一起可以簡化複雜的資料轉換,例如將物件清單轉換為分組的Map,其中每個群組包含特定屬性。
範例程式碼
import java.util.List; import java.util.Map; import java.util.stream.Collectors; class User { private String department; private String name; // Constructors, getters, setters } public class GroupingByMappingExample { public static void main(String[] args) { List<User> users = List.of( new User("HR", "Alice"), new User("IT", "Bob"), new User("HR", "Charlie") ); Map<String, List<String>> groupedMap = users.stream() .collect(Collectors.groupingBy(User::getDepartment, Collectors.mapping(User::getName, Collectors.toList()))); System.out.println(groupedMap); } }
在此範例中,我們按部門對使用者進行分組,然後將User 物件對應到他們的名稱,建立一個Map,其中每個部門與名稱清單相關聯。
示範結果
{HR=[Alice, Charlie], IT=[Bob]}
5. 分組依據、映射和歸約
結合分組、映射和歸約可以讓您有效地聚合數據,例如對值求和或查找每個組中的最大值。
範例程式碼
import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Transaction { private String type; private int amount; // Constructors, getters, setters } public class GroupingByMappingReducingExample { public static void main(String[] args) { List<Transaction> transactions = List.of( new Transaction("Deposit", 100), new Transaction("Deposit", 200), new Transaction("Withdrawal", 50), new Transaction("Withdrawal", 30) ); Map<String, Integer> transactionSums = transactions.stream() .collect(Collectors.groupingBy(Transaction::getType, Collectors.reducing(0, Transaction::getAmount, Integer::sum))); System.out.println(transactionSums); } }
在此代碼中,我們按類型對交易進行分組,將它們映射到其金額,然後透過求和來減少金額。結果是一個顯示每種交易類型總金額的地圖。
示範結果
import java.util.List; import java.util.Map; import java.util.stream.Collectors; class User { private int id; private String name; // Constructors, getters, setters } public class EntityCacheExample { public static void main(String[] args) { List<User> users = List.of( new User(1, "Alice"), new User(2, "Bob"), new User(3, "Charlie") ); Map<Integer, User> userCache = users.stream() .collect(Collectors.toMap(User::getId, user -> user)); System.out.println(userCache); } }
六、結論
這些進階 Java Stream 技巧可以顯著提高您的編碼效率和可讀性。透過掌握這些技術,您可以輕鬆處理複雜的資料處理任務。如果您有任何疑問或需要進一步說明,請隨時在下面發表評論!
閱讀更多文章:您需要了解的 5 個進階 Java 串流技巧
以上是您需要了解的高階 Java Stream 技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
