オプションの属性によるJava8ストリームのグループ化

CustardBun

属性から計算された値でグループ化しようとしています。計算された値はオプションです-もう少し明確にするために、彼は単純化された例です:

class Foo: 
   int id;
   Group group;
   .. some other stuff

class Group: 
   String groupId;
   ... (some other stuff)

class SomeName:
   String someAttribute;

class Converter:
   public Optional<SomeName> getSomenameFromGroup(Group)

Converterのメソッドは自分のものではないため、変更できません。

SomeNameの「someAttribute」でフィルタリングしたいFooのリストがあります。

たとえば、私は次のようなものを持っています:

Map<String, List<Foo>> fooBySomeName = 
  fooList.stream().collect(Collectors
    .groupingBy(foo -> {
        Optional<SomeName> name = 
           converter.getSomenameFromGroup(foo.getGroup.getGroupId());
        return name.isPresent() ? name.get().someAttribute() : "";
    }));

ただし、groupingByステートメントに名前が含まれていない場合は、マップに何も表示したくないということです。私はこのようなものを持っていました:

fooBySomeNames.remove("")

そのキーでグループ化されたマップから何かを削除できると思いますが、groupingByステートメントでこれを行うためのよりクリーンでより正しい方法はありますか?

pscuderi

次のように、フィルタを使用してエントリを削除できます。

Map<String, List<Foo>> fooBySomeName = fooList.stream()
    .filter(foo -> fooToSomeAttribute(foo).isPresent())
    .collect(Collectors.groupingBy(foo -> fooToSomeAttribute(foo).get()));

private static Optional<String> fooToSomeAttribute(Foo foo)
{
    return Optional.ofNullable(foo)
        .map(Foo::getGroup)
        .flatMap(new Converter()::getSomenameFromGroup)
        .map(SomeName::getSomeAttribute);
}

または、ペアオブジェクトを使用すると、すべてのFooに対してsomeAttributeの二重計算を回避できます。

Map<String, List<Foo>> fooBySomeName = fooList.stream()
    .filter(Objects::nonNull)
    .map(FooAndSomeAttribute::new)
    .filter(pair -> pair.getSomeAttribute().isPresent())
    .collect(Collectors.groupingBy(
        pair -> pair.getSomeAttribute().get(),
        Collectors.mapping(
            FooAndSomeAttribute::getFoo, 
            Collectors.toList())));

private static class FooAndSomeAttribute
{
    private final Foo foo;
    private final Optional<String> someAttribute;

    public FooAndSomeAttribute(Foo foo)
    {
        this.foo = foo;
        this.someAttribute = Optional.ofNullable(foo)
            .map(Foo::getGroup)
            .flatMap(new Converter()::getSomenameFromGroup)
            .map(SomeName::getSomeAttribute);
    }

    public Foo getFoo() 
    {
        return foo;
    }

    public Optional<String> getSomeAttribute() 
    {
        return someAttribute;
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

java8のストリームgroupingbyを使用した文字列のコレクションによるグループ化

分類Dev

Java8ストリームとリストのグループ化

分類Dev

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

分類Dev

以前の要素を含む条件によるグループへのJava8パーティションリスト

分類Dev

Javaストリームを使用したコレクションの属性によってグループ

分類Dev

最小および最大によるJava8ストリームグループ

分類Dev

ストリームとJava8を使用して、リスト内のオブジェクトを属性ごとに他のリストにグループ化する方法は?

分類Dev

Java 8によるグループ化、カウント、カスタムオブジェクトへの変換

分類Dev

Java8オプションとストリームのネストされたnullチェック

分類Dev

Java8のストリームとコレクターを使用したコレクションからマップへの変換のカプセル化

分類Dev

によってグループ化Javaの8ストリームの複数

分類Dev

ストリームを使用してJava8で値の範囲でグループ化する方法

分類Dev

ストリームを使用してJava8で値の範囲でグループ化する方法

分類Dev

Java 8、整数のストリーム、整数によるストリームのインデックスのグループ化?

分類Dev

Java 8でのマップのリストによるグループ化

分類Dev

Java8ストリームのプロパティによってオブジェクトのグループ化で複数の合計を計算する方法は?

分類Dev

Java8のオプションリターンを使用したJPAのベストプラクティス?

分類Dev

文字列のリストを含むオブジェクト内でのJava8ストリームのグループ化

分類Dev

ストリームを使用して複数の属性でグループ化およびソート:Java 8

分類Dev

オブジェクトのグループ化java8

分類Dev

属性によってオブジェクトのリストをグループ化する:Java

分類Dev

複数のフィールドによるJava8ラムダのグループ化

分類Dev

複数のフィールドによるJava8ラムダのグループ化

分類Dev

Swiftストリングによるオプションのチェーン

分類Dev

Java8はマップするリストのリストをグループ化します

分類Dev

演奏する!Java8のフレームワークサポートオプション

分類Dev

java8ストリームのグループ化複合変数の合計

分類Dev

java8ストリームのグループ化複合変数の合計

分類Dev

マージオブジェクトまたは集約によりグループ化java8ストリーム

Related 関連記事

  1. 1

    java8のストリームgroupingbyを使用した文字列のコレクションによるグループ化

  2. 2

    Java8ストリームとリストのグループ化

  3. 3

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

  4. 4

    以前の要素を含む条件によるグループへのJava8パーティションリスト

  5. 5

    Javaストリームを使用したコレクションの属性によってグループ

  6. 6

    最小および最大によるJava8ストリームグループ

  7. 7

    ストリームとJava8を使用して、リスト内のオブジェクトを属性ごとに他のリストにグループ化する方法は?

  8. 8

    Java 8によるグループ化、カウント、カスタムオブジェクトへの変換

  9. 9

    Java8オプションとストリームのネストされたnullチェック

  10. 10

    Java8のストリームとコレクターを使用したコレクションからマップへの変換のカプセル化

  11. 11

    によってグループ化Javaの8ストリームの複数

  12. 12

    ストリームを使用してJava8で値の範囲でグループ化する方法

  13. 13

    ストリームを使用してJava8で値の範囲でグループ化する方法

  14. 14

    Java 8、整数のストリーム、整数によるストリームのインデックスのグループ化?

  15. 15

    Java 8でのマップのリストによるグループ化

  16. 16

    Java8ストリームのプロパティによってオブジェクトのグループ化で複数の合計を計算する方法は?

  17. 17

    Java8のオプションリターンを使用したJPAのベストプラクティス?

  18. 18

    文字列のリストを含むオブジェクト内でのJava8ストリームのグループ化

  19. 19

    ストリームを使用して複数の属性でグループ化およびソート:Java 8

  20. 20

    オブジェクトのグループ化java8

  21. 21

    属性によってオブジェクトのリストをグループ化する:Java

  22. 22

    複数のフィールドによるJava8ラムダのグループ化

  23. 23

    複数のフィールドによるJava8ラムダのグループ化

  24. 24

    Swiftストリングによるオプションのチェーン

  25. 25

    Java8はマップするリストのリストをグループ化します

  26. 26

    演奏する!Java8のフレームワークサポートオプション

  27. 27

    java8ストリームのグループ化複合変数の合計

  28. 28

    java8ストリームのグループ化複合変数の合計

  29. 29

    マージオブジェクトまたは集約によりグループ化java8ストリーム

ホットタグ

アーカイブ