Mam strukturę danych o nazwie MyPojo
, która ma pola o nazwach time
, name
i timetaken
(wszystkie są w ciągach). Próbuję zrobić grupowanie następująco:Java 8 odbierz i zmień format wyniku.
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))));
Należy pamiętać, że mam metodę o nazwie getTimeTakenAsDouble
przekonwertować ciąg timetaken
do podwójnej wartości.
Wynika to w sposób następujący:
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0}}
Jednak moja frontend developer chciał albo dane w następującym formacie:
{ABC={2017=25.0, 2016=25.0}, XYZ={2017=40.0, 2016=0.0}}
lub
[
{
"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
}
]
Zastanawiam się wykonaj iteracje na resultMap
i przygotuj drugi format. Próbuję ponownie wykonać iterację na resultMap
. Czy jest jakaś inna metoda radzenia sobie z tym?
Co to jest "distinctYears"? –
@VimalrajSelvam my bad. Właśnie dodano – Eugene
To jest dobre podejście. Chociaż kiedy musiałem to zrobić, zrobiłem to na odwrót: najpierw utworzyłem mapę i wypełniłem ją wszystkimi * zerowymi * wpisami dla każdej możliwej grupy, a następnie użyłem kolektora (albo "groupingBy" lub "toMap"). ') z niestandardowym dostawcą map'() -> myMapWithZeroes'. –