私はこのコードを持っています:
Map<List<Object>, Long> collector = root.getReports().stream().collect(
Collectors.groupingBy(r -> Arrays.asList(i.X(), i.Y(), i.Z(), i.A()), Collectors.counting()));
for(Entry<Object, Long> entry : collector.entrySet())
System.out.println(String.format("%s = %s", entry.getKey(), entry.getValue()));
これは基本的にこれを生成します:
[16292, 141, 6, 100] = 2
[16288, 250, 59, 500] = 14
[16286, 250, 91, 50] = 4
[16287, 250, 91, 60] = 29
[16286, 250, 91, 80] = 10
[16293, 141, 6, 100] = 3
[16282, 079, 116, 50] = 9
...
この結果をカスタムクラスに入れる必要があります。これは次のとおりです。
@EqualsAndHashCode @ToString
public class CustomReport implements Serializable {
private static final long serialVersionUID = 2074900904056768029L;
@Getter @Setter
private Integer x, y, z;
@Getter @Setter
private String a;
@Getter @Setter
private Long result;
}
すべてのリストを調べずに手動で行う方法はありますか?
これがあなたが望むものかどうかはわかりません。ただしMap<CustomReport, Long>
、最初にa Map<List<Object>, Long>
を作成してからそれを経由してそれらのオブジェクトをターゲットクラスに変換する代わりに、直接を取得できます。
前提条件はつまりCustomReport
有するべきであるequals()
[ 1 ]及びhashCode()
[ 2 ]実施します
次に、これを行うことができます:
root.getReports().stream().collect(
Collectors.groupingBy(i -> new CustomReport(i.X(), i.Y(), i.Z(), i.A()),
HashMap::new,
Collectors.counting()));
私はCustomReport
互換性のあるコンストラクタも持っていると仮定しています。セッターで初期化する必要がある場合は、分類子の最初の引数を次のように置き換えることができます。
i -> {
CustomReport c = new CustomReport();
c.setX(i.X());
...
return c;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加