「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 知っておくべき高度な Java ストリーム トリック

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

2024 年 11 月 18 日に公開
ブラウズ:245

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 users = List.of(
            new User(1, "Alice"),
            new User(2, "Bob"),
            new User(3, "Charlie")
        );

        Map 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 users = List.of(
            new User("HR", "Manager", "Alice"),
            new User("IT", "Developer", "Bob"),
            new User("IT", "Manager", "Charlie")
        );

        Map>> 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. 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 users = List.of(
            new User(1, "Alice", 30),
            new User(2, "Bob", 25),
            new User(3, "Charlie", 35)
        );

        Map> 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. グループ化とマッピング

グループ化とマッピングを一緒に行うと、オブジェクトのリストを、各グループに特定の属性が含まれるグループ化された 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 users = List.of(
            new User("HR", "Alice"),
            new User("IT", "Bob"),
            new User("HR", "Charlie")
        );

        Map> 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 transactions = List.of(
            new Transaction("Deposit", 100),
            new Transaction("Deposit", 200),
            new Transaction("Withdrawal", 50),
            new Transaction("Withdrawal", 30)
        );

        Map transactionSums = transactions.stream()
            .collect(Collectors.groupingBy(Transaction::getType,
                Collectors.reducing(0, Transaction::getAmount, Integer::sum)));

        System.out.println(transactionSums);
    }
}

このコードでは、トランザクションをタイプ別にグループ化し、それらを金額にマッピングし、合計して金額を減らします。結果は、各取引タイプの合計金額を示すマップになります。

デモ結果

{Deposit=300, Withdrawal=80}

6. 結論

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

投稿の詳細はで読む: 知っておくべき 5 つの高度な Java ストリーム トリック

リリースステートメント この記事は次の場所に転載されています: https://dev.to/anh_trntun_4732cf3d299/5-advanced-java-stream-tricks-you-need-to-know-4i8h?1 侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3