Применение метода Reduce для группировки по результату в Java 8 - PullRequest
0 голосов
/ 28 октября 2018

m плохо знаком с Java и пытается Java 8 map и уменьшить . У меня есть текущий сценарий.

У меня есть класс с именем DS, который выглядит следующим образом:

package com.srm;

public class DS {
  private String time;
  private int transaction;
  private String item;
    public DS(String time, int transaction, String item) {
      this.time = time;
      this.transaction = transaction;
      this.item = item;
    }
 //Simple getters and setter here.
}

Есть несколько элементов с несколькими номерами транзакций.

 Map<String, List<DS>> myStream = mylist.stream()
                .collect(Collectors.groupingBy(DS::getItem));

здесь mylist содержит записи элементов с номером транзакции и временем транзакции. И эта строка сгруппировала эти записи как

  {Cherry me Dried fruit=[com.srm.DS@7699a589//(no. of transactions), com.srm.DS@58372a00, com.srm.DS@4dd8dc3], Brownie=[com.srm.DS@6d03e736]}

Теперь я хочу добавить транзакции для каждого элемента и преобразовать верхний ответ в следующее:

 {Cherry me Dried fruit=10, Brownie=1}

Я использовал карту и уменьшил, как следующий код:

Iterator<String> itr = myStream.keySet().iterator();
        while (itr.hasNext()) {
            if (itr.next() != null) {
                List<DS> values = myStream.get(itr.next());
                Stream<Integer> lengthStream = values.stream().map(s -> s.getTransaction());
            int sum = lengthStream.reduce(0, (x, y) -> x + y);
            }
        }

что не очень хорошо aproach.i не могу использовать для этого один вкладыш .map () и .reduce (). Возможно ли это сделать без зацикливания ключей объекта?

Любая помощь, пожалуйста!

1 Ответ

0 голосов
/ 28 октября 2018

Похоже, вы ищете это:

 myList.stream()
       .collect(Collectors.groupingBy(
           DS::getItem,
           Collectors.summingInt(DS::getTransaction)
 ))

РЕДАКТИРОВАТЬ:

 myList.stream()
        .map(x -> new SimpleEntry<>(x.getItem(), x.getTransaction()))
        .reduce(
            new HashMap<String, Integer>(),
            (map, entry) -> {
                HashMap<String, Integer> inner = new HashMap<>();
                inner.putAll(map);
                inner.merge(entry.getKey(), entry.getValue(), Integer::sum);
                return inner;
            },
            (left, right) -> {
                HashMap<String, Integer> inner = new HashMap<>();
                inner.putAll(left);
                inner.putAll(right);
                return inner;
            }
        );
...