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

ラウロGripaネト:

どのように私のグループは、オブジェクトの属性の2により、オブジェクトの内部リストしていますか?

私は私が持っているのDrools 7.9.0およびJava 8を使用しているResult各マッチしたDroolsのルールへのリターンとして使用されるクラスを。

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
@NoArgsConstructor
public class Result implements Serializable {

    private Integer id;
    private String name;
    private List<Occurrences> occurrences = new ArrayList<>();

    public void addOccurrence(Occurrences occurrence) {
        this.occurrences.add(occurrence);
    }
}

Droolsの実行後、私はで終わりますList<Result>JSONに変換し、それはこのようになります。

CURRENT結果:

[
     {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

私は私のリストアップグループに必要なResultように、S ocurrencesによってグループ化されているidname、このように、。

期待される成果:

[
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }, {
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

これを実装するための最良の方法は何でしょうか?私は2つのオプションがあります。

  1. 私はので、変更DroolsのルールList<Result>すでに双方向Iの必要性が構成されています。たぶん持つクラスを作成するaddResultチェックのリストという方法idnameしては、右のエントリに発生したことを追加します。それはルール内の複雑さが増加しますので、しかし、これは、理想的ではありません。
  2. 私の後処理List<Result>ので、それのグループoccurrencesによってをidしてnameしかし、私はどのように最適化され、簡単な方法でこれを行うには考えています。

第二のオプションを行うための最善の方法は何ですか?

エティエンヌMiret:

私は、次のようにメソッドを追加しますResult

Result addOccurrences (List<Occurrences> occurrences) {
  this.occurrences.addAll (occurrences);
  return this;
}

そして、あなたはストリームを使用することができます。

List<Result> collect = results.stream ()
  .collect (Collectors.groupingBy (Result::getId, Collectors.groupingBy (Result::getName, Collectors.toList ())))
  .values ()
  .stream ()
  .map (Map::values)
  .flatMap (Collection::stream)
  .map (Collection::stream)
  .map (resultStream -> resultStream.reduce ((r0, r1) -> r0.addOccurrences (r1.getOccurrences ())))
  .filter (Optional::isPresent)
  .map (Optional::get)
  .collect (Collectors.toList ());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=177516&siteId=1