time
,name
およびtimetaken
というフィールドを持つMyPojo
という名前のデータ構造体があります(すべてが文字列です)。私は次のようにいくつかのグループ分けをやろうとしている:Java 8は、結果のフォーマットを収集し、変更します
List<MyPojo> myPojos = Arrays.asList(
new MyPojo("2017", "ABC", "30"),
new MyPojo("2017", "ABC", "20"),
new MyPojo("2016", "ABC", "25"),
new MyPojo("2017", "XYZ", "40")
);
Map<String, Map<String, Double>> resultMap = myPojos.stream()
.collect(Collectors.groupingBy(MyPojo::getName,
Collectors.groupingBy(MyPojo::getTime,
Collectors.averagingDouble(MyPojo::getTimeTakenAsDouble))));
私は方法は、二重の値にtimetaken
文字列を変換するgetTimeTakenAsDouble
を呼んでいることに注意してください。
次のようにこれは、結果:
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0}}
はしかし、私のフロントエンド開発者はデータを望んでいた以下のいずれかの形式で:
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0, 2016=0.0}}
または
[
{
"time": "2017",
"name": "ABC",
"avgTimeTaken": 25.0
},
{
"time": "2017",
"name": "XYZ",
"avgTimeTaken": 40.0
},
{
"time": "2016",
"name": "ABC",
"avgTimeTaken": 25.0
},
{
"time": "2016",
"name": "XYZ",
"avgTimeTaken": 0.0
}
]
私はに考えていますresultMap
で繰り返しを実行し、2番目の形式を準備します。私はresultMap
で繰り返しを実行しようとしています。これを処理する他の方法はありますか?
「distinctYears」とは何ですか? –
@VimalrajSelvam私の悪い。ちょうど追加 – Eugene
これは良いアプローチです。これを行う必要があるときには、もう一度やりました:最初にマップを作成し、可能なグループごとにすべての* zero *エントリを入力してから、コレクタを使用しました(groupingByまたはtoMap ')をカスタムマップサプライヤ'() - > myMapWithZeroes'で置き換えます。 –