У меня есть Карта с номерами продаж, разделенными на год:
Map<Integer, BigDecimal> sales_by_year = new TreeMap<>();
sales_by_year.put(2012, BigDecimal.valueOf(19283));
sales_by_year.put(2013, BigDecimal.valueOf(24832));
sales_by_year.put(2014, BigDecimal.valueOf(19562));
sales_by_year.put(2015, BigDecimal.valueOf(21879));
sales_by_year.put(2016, BigDecimal.valueOf(23587));
sales_by_year.put(2017, BigDecimal.valueOf(28756));
и список, по каким годам я хочу добавить эти продажи:
Set<Integer> years = new HashSet<>(Arrays.asList(new Integer[] {2012, 2013, 2014}));
, и я хочунаписать лямбду, чтобы объединить эти годы в один BigDecimal
.Я написал это:
BigDecimal sales_for_timeframe = sales_by_year.entrySet().stream()
.filter(a -> years.contains(a.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
.values().stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(sales_for_timeframe);
и это работает.Но это самый эффективный способ?Это решение:
- Преобразует карту в поток
- Фильтрует карту
- Собирает ее обратно в новую карту
- Преобразует новую картуvalueSet в поток
- Уменьшает значения до одного
BigDecimal
Есть ли способ уменьшить количество шагов?Повысит ли это эффективность?Или это лучшее решение?