ホームページ  >  記事  >  Java  >  知っておくべき高度な Java ストリーム トリック

知っておくべき高度な Java ストリーム トリック

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-10 16:19:02622ブラウズ

dvanced Java Stream Tricks You Need to Know

1. エンティティをキャッシュするためのマップの作成

マップ内のエンティティをキャッシュすると、データベースや他のデータ ソースからデータを繰り返しフェッチする必要性が減り、パフォーマンスが向上します。 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 を作成する方法を示しています。外側の マップ はユーザーを部門別にグループ化し、内側の マップ はさらに役割別にグループ化します。

デモ結果

{HR={Manager=[User{name='Alice'}]}, IT={Developer=[User{name='Bob'}], Manager=[User{name='Charlie'}]}}

3. 2 つの値を含むマップの作成

場合によっては、マップ内の 1 つのキーに対して複数の属性を保存したい場合があります。 地図
の使用 >
は効果的な解決策となる可能性があります。

コード例

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 を使用して、各ユーザー ID に関連付けられた 2 つの値 (名前と年齢) を持つマップを作成します。

デモ結果

{1=Alice=30, 2=Bob=25, 3=Charlie=35}

4. グループ化とマッピング

グループ化とマッピングを一緒に行うと、オブジェクトのリストを、各グループに特定の属性が含まれるグループ化された マップ に変換するなど、複雑なデータ変換を簡素化できます。

コード例

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 オブジェクトをその名前にマッピングして、各部門が名前のリストに関連付けられた マップ を作成します。

デモ結果

{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);
    }
}

6. 結論

これらの高度な Java Stream トリックにより、コーディングの効率と読みやすさが大幅に向上します。これらのテクニックをマスターすると、複雑なデータ処理タスクを簡単に処理できるようになります。ご質問がある場合、またはさらに説明が必要な場合は、お気軽に以下にコメントしてください。

詳細については、 で投稿をご覧ください: 知っておくべき 5 つの高度な Java ストリーム トリック

以上が知っておくべき高度な Java ストリーム トリックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。