首頁 >Java >java教程 >您需要了解的高階 Java Stream 技巧

您需要了解的高階 Java Stream 技巧

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-10 16:19:02675瀏覽

dvanced Java Stream Tricks You Need to Know

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn