Java 8ストリーム:マルチレベル/複合オブジェクトの構築

大天使

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

ジェネリックスのコンパイルに失敗しました。

  • Java 8ストリームを使用してマルチレベルの複合ドメインオブジェクトを構築するための最良の方法は何ですか?
  • collectionAndThen /フィニッシャーは良い考えですか?
  • または、groupingByとそれに続くマッピング関数のみを使用しますか?
  • 分類子をオブジェクトに変換しますか(一種の第1レベルのマッピング関数ですか?)

最後に、マップを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]

編集
0

コメントを追加

0

関連記事

分類Dev

Java 8ストリーム:マルチレベル/複合オブジェクトの構築

分類Dev

マルチスレッド環境でのJavaオブジェクトの構築

分類Dev

Javaの8ストリームを使用して2つのアレイ複合オブジェクト要素をフィルタリングします

分類Dev

Java 8ストリーム-オブジェクトの合計

分類Dev

入力ファイルからのJava 8ストリームの複数のオブジェクトの作成

分類Dev

Javaでマルチレベルのマップからリストを構築8

分類Dev

第1レベルと第2レベルのオブジェクトをストリームに保持したJavaストリームflatMap

分類Dev

倍数のソースから構築物オブジェクトは、カスタム関数を8にJAVA

分類Dev

Javaストリームを使用した複雑なオブジェクトのグループリスト

分類Dev

Javaストリームとグループ化:オブジェクトを複数のグループに配置

分類Dev

Javaでのマルチスレッド、オブジェクトの参照

分類Dev

Javaでマルチスレッドのプログラムでのオブジェクトの可視性

分類Dev

グループ複数の属性によって、オブジェクトの内部リスト:Javaの8

分類Dev

Java8のオブジェクトストリームからキー/値としてオブジェクトフィールドを使用してマップをエレガントに作成します

分類Dev

Java8のオブジェクトストリームからキー/値としてオブジェクトフィールドを使用してマップをエレガントに作成します

分類Dev

Javaストリーム。複数のオブジェクトのリストを1つのオブジェクトに結合して結合する方法は?

分類Dev

ストリームを使用して、クラスオブジェクトから複数のフィールドを抽出Java8

分類Dev

キーなどのオブジェクトを持つJava 8ストリームgroupingByオブジェクトフィールド

分類Dev

Javaの8ストリームAPI:複数のグループに同じオブジェクトを持っているGroupingByを使用する方法?

分類Dev

Streams Java 8を使用してカスタムオブジェクトのリストを単一のリストオブジェクトにマージする

分類Dev

Javaマルチスレッド:オブジェクトをリスト/キュー/セットに追加するための安価な操作

分類Dev

Java8ストリームAPIを使用して複数の属性でオブジェクトをグループ化する

分類Dev

Javaの8ストリーム:コレクターフィルターオブジェクトを返します

分類Dev

Java 8ストリーム:オブジェクトのリストからマップを抽出し、特定のキーを合計します

分類Dev

Javaのストリームを使用してフィールド値の複数のリストへのオブジェクトの分割リスト

分類Dev

Java 8ストリームは、マップをフィルタリングした後に元のオブジェクトを取得します

分類Dev

forループを使用せずにJavaで複数のリストの各アイテムをオブジェクトにマップする方法

分類Dev

ストリームを使用してJavaでオブジェクトのコレクションをマップおよびフィルタリングするためのベストプラクティス

分類Dev

JavaストリームAPI。1行にオブジェクトのマッチング述語のフィールドを検索します。存在していない場合は、いくつかのデフォルト値を返します。

Related 関連記事

  1. 1

    Java 8ストリーム:マルチレベル/複合オブジェクトの構築

  2. 2

    マルチスレッド環境でのJavaオブジェクトの構築

  3. 3

    Javaの8ストリームを使用して2つのアレイ複合オブジェクト要素をフィルタリングします

  4. 4

    Java 8ストリーム-オブジェクトの合計

  5. 5

    入力ファイルからのJava 8ストリームの複数のオブジェクトの作成

  6. 6

    Javaでマルチレベルのマップからリストを構築8

  7. 7

    第1レベルと第2レベルのオブジェクトをストリームに保持したJavaストリームflatMap

  8. 8

    倍数のソースから構築物オブジェクトは、カスタム関数を8にJAVA

  9. 9

    Javaストリームを使用した複雑なオブジェクトのグループリスト

  10. 10

    Javaストリームとグループ化:オブジェクトを複数のグループに配置

  11. 11

    Javaでのマルチスレッド、オブジェクトの参照

  12. 12

    Javaでマルチスレッドのプログラムでのオブジェクトの可視性

  13. 13

    グループ複数の属性によって、オブジェクトの内部リスト:Javaの8

  14. 14

    Java8のオブジェクトストリームからキー/値としてオブジェクトフィールドを使用してマップをエレガントに作成します

  15. 15

    Java8のオブジェクトストリームからキー/値としてオブジェクトフィールドを使用してマップをエレガントに作成します

  16. 16

    Javaストリーム。複数のオブジェクトのリストを1つのオブジェクトに結合して結合する方法は?

  17. 17

    ストリームを使用して、クラスオブジェクトから複数のフィールドを抽出Java8

  18. 18

    キーなどのオブジェクトを持つJava 8ストリームgroupingByオブジェクトフィールド

  19. 19

    Javaの8ストリームAPI:複数のグループに同じオブジェクトを持っているGroupingByを使用する方法?

  20. 20

    Streams Java 8を使用してカスタムオブジェクトのリストを単一のリストオブジェクトにマージする

  21. 21

    Javaマルチスレッド:オブジェクトをリスト/キュー/セットに追加するための安価な操作

  22. 22

    Java8ストリームAPIを使用して複数の属性でオブジェクトをグループ化する

  23. 23

    Javaの8ストリーム:コレクターフィルターオブジェクトを返します

  24. 24

    Java 8ストリーム:オブジェクトのリストからマップを抽出し、特定のキーを合計します

  25. 25

    Javaのストリームを使用してフィールド値の複数のリストへのオブジェクトの分割リスト

  26. 26

    Java 8ストリームは、マップをフィルタリングした後に元のオブジェクトを取得します

  27. 27

    forループを使用せずにJavaで複数のリストの各アイテムをオブジェクトにマップする方法

  28. 28

    ストリームを使用してJavaでオブジェクトのコレクションをマップおよびフィルタリングするためのベストプラクティス

  29. 29

    JavaストリームAPI。1行にオブジェクトのマッチング述語のフィールドを検索します。存在していない場合は、いくつかのデフォルト値を返します。

ホットタグ

アーカイブ