У меня есть набор объектов, ProductDetails со следующими полями,
public class ProductDetails {
String productId;
Set<CityQty> qtyByCities;
}
@EqualsAndHashCode(of = {"name"})
public class CityQty {
String name;
int qty;
}
Я хочу преобразовать это в набор CityQty, где каждый город имеет общее количество всех продуктов.
Пример ввода:
[{"productId":"Item01","qtyByCities":[{"name":"New York", "qty":24},{"name":"Washington", "qty":68}]},
{"productId":"Item02","qtyByCities":[{"name":"New York", "qty":20}]}]
Пример вывода:
[{"name":"New York", "qty":44},{"name":"Washington", "qty":68}]
Я написал следующий код для достижения этой цели:
Set<CityQty> cities = new HashSet<>();
setOfItems.stream().flatMap(product -> product.getQtyByCities().stream())
.forEach(cityQty -> {
String cityName = cityQty.getName();
CityQty city = cities.stream()
.filter(cityQty -> cityQty.getName().equals(cityName))
.findFirst()
.orElse(new CityQty(cityName, 0));
city.setQty(city.getQty() + cityQty.getQty());
cities.add(city);
});
Приведенное выше решение работает нормально, но я ищу более элегантное решение, возможно, использующее любую функциональность Java 8, которую я здесь упускаю, которая не требует от меня повторения набора cities
для каждой итерации внутри forEach
лямбда.
Можно ли решить эту проблему более эффективно и лаконично?