マップ内のエンティティをキャッシュすると、データベースや他のデータ ソースからデータを繰り返しフェッチする必要性が減り、パフォーマンスが向上します。 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'}}
ネストされたマップは、データを複数のレベルに分類する必要がある場合に役立ちます。たとえば、ユーザーを部門ごとにグループ化し、次に役割ごとにグループ化することができます。
コード例
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'}]}}
場合によっては、マップ内の 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}
グループ化とマッピングを一緒に行うと、オブジェクトのリストを、各グループに特定の属性が含まれるグループ化された マップ に変換するなど、複雑なデータ変換を簡素化できます。
コード例
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]}
グループ化、マッピング、リデュースを組み合わせると、値の合計や各グループの最大値の検索など、データを効率的に集計できます。
コード例
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 ストリーム トリックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。