ラウロ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
によってグループ化されているid
とname
、このように、。
期待される成果:
[
{
name: "Whatever"
id: 0001,
occurrences: [{
(...)
}, {
(...)
}]
},
{
name: "Whatever"
id: 0002,
occurrences: [{
(...)
}]
},
{
name: "Other thing"
id: 0002,
occurrences: [{
(...)
}]
}
]
これを実装するための最良の方法は何でしょうか?私は2つのオプションがあります。
- 私はので、変更Droolsのルール
List<Result>
すでに双方向Iの必要性が構成されています。たぶん持つクラスを作成するaddResult
チェックのリストという方法id
とname
しては、右のエントリに発生したことを追加します。それはルール内の複雑さが増加しますので、しかし、これは、理想的ではありません。 - 私の後処理
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 ());