Java8ストリームAPIを使い始めています。「SQL結果セット」のリストをドメインオブジェクト、つまり複合構造に変換したいと思います。
ドメインオブジェクト:ユーザーには権限のコレクションがあり、各権限にはアプリケーションの年のコレクションがあります。たとえば、Johnには2つの権限(MODERATORとDEV)があります。そのモデレーター権限は2014年と2015年にのみ適用され、その開発権限は2014年にのみ適用されます。
class User {
// some primitives attributes
List<Permission> permission;
}
class Permission {
// some primitives attributes
List<Integer> years;
}
今、私はクエリを作成し、次のようなフラットな結果のリストを取得しました。
[1, "moderator", 2014]
[1, "moderator", 2015]
[1, "dev", 2014]
[2, "dev", 2010]
[2, "dev", 2011]
[2, "dev", 2012]
1と2はuserIdです。
いろいろ試してみましたが、結局流暢というより複雑です。そして、機能しませんでした:)
Java 8の本で、コレクターを使用してdompainオブジェクトを作成するのは「簡単」であると読みました。
それを読んだとき、私は少し泣きました: '(
私は試した
sb.collect(
collectingAndThen(
groupingBy(
Mybean::getUserId,
collectingAndThen(
groupingBy(Monbean::getPermissionId, mapping(convertPermission, toList())),
finisherFonction)
),
convertUser)
);
ジェネリックスのコンパイルに失敗しました。
最後に、マップをList<User>
削除して結果を取得したいので(entrySetにマップ呼び出しを追加して変換を完了することができると思います)。
私はあなたにいくつかのオプションを提供させてください、そしてあなたはあなたにとって最も明確に見えるものを決定します。UserコンストラクターはでUser(int userId, List<Permission> permissions)
あり、Permissionコンストラクターはであると想定しています。Permission(String permissionId, List<Integer> years)
オプション1:直接的なアプローチ。ユーザーIDでグループ化し、各ユーザーIDの権限のリストを作成し、ユーザーオブジェクトを作成します。個人的には、コレクターでこれほど多くのネストを追跡するのは難しいと思います。
List<User> users = beans.stream()
.collect(
groupingBy(
MyBean::getUserid,
collectingAndThen(
groupingBy(
MyBean::getPermission,
mapping(MyBean::getYear, toList())
),
t -> t.entrySet().stream()
.map(e -> new Permission(e.getKey(), e.getValue()))
.collect(toList())
)
)
).entrySet().stream()
.map(e -> new User(e.getKey(), e.getValue()))
.collect(toList());
オプション2:上記と同じですが、わかりやすくするために権限コレクターを個別に作成します。
Collector<MyBean, ?, List<Permission>> collectPermissions = collectingAndThen(
groupingBy(MyBean::getPermission, mapping(MyBean::getYear, toList())),
t -> t.entrySet().stream()
.map(e -> new Permission(e.getKey(), e.getValue()))
.collect(toList())
);
List<User> users = beans.stream()
.collect(groupingBy(MyBean::getUserid, collectPermissions))
.entrySet().stream()
.map(e -> new User(e.getKey(), e.getValue()))
.collect(toList());
オプション3:最初にBeanをuseridのマップにロールし、permissionidのマップを年のリストにマップします(Map<Integer, Map<String, List<Integer>>
)。次に、マップからドメインオブジェクトを作成します
List<User> users = beans.stream().collect(
groupingBy(
MyBean::getUserid,
groupingBy(
MyBean::getPermission,
mapping(MyBean::getYear, toList())
)
)
).entrySet().stream()
.map(u -> new User(
u.getKey(),
u.getValue().entrySet().stream()
.map(p -> new Permission(p.getKey(), p.getValue()))
.collect(toList())
)
).collect(toList());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加