How to display the sum of the Duration field from a stream in java?

I am trying to create a map that contains the activity and the total duration of this activity, knowing that the activity appears more times with different durations.

Normally I would solve it like this:

Map<String,Duration> result2 = new HashMap<String,Duration>();
     for(MonitoredData m: lista)
     {
         if(result2.containsKey(m.getActivity())) result2.replace(m.getActivity(),result2.get(m.getActivity()).plus(m.getDuration()));
         else result2.put(m.getActivity(), m.getDuration());
     }

But I am trying to do this with a stream, but I cannot figure out how to put the sum there.

Function<Duration, Duration> totalDuration = x -> x.plus(x);
Map<String, Duration> result2 = lista.stream().collect(
                        Collectors.groupingBy(MonitoredData::getActivity,
                                Collectors.groupingBy(totalDuration.apply(), Collectors.counting()))
                );

I tried to group them in various ways, match them directly, or sum them directly in brackets, but I was stuck.

+4
source share
1 answer

Use the 3 argument version of the collector toMap:

import static java.util.stream.Collectors.toMap;

Map<String,Duration> result = lista.stream()
    .collect(toMap(MonitoredData::getActivity, MonitoredData::getDuration, Duration::plus));

, Map Java 8. merge. :

for (MonitoredData m: lista) {
    result.merge(m.getActivity(), m.getDuration(), Duration::plus);
}
+4

Source: https://habr.com/ru/post/1677195/


All Articles