Using streams to sum a collection of immutable `Duration` objects, in Java

Basil Bourque :

The java.time.Duration class built into Java 8 and later represents a span of time unattached to the timeline on the scale of hour-minutes-seconds. The class offers a plus method to sum two such spans of time.

The java.time classes use immutable objects. So the Duration::plus method returns a new third Duration object as a result rather than altering (mutating) either of the input objects.

The conventional syntax to sum a collection of Duration objects would be the following.

Duration total = Duration.ZERO;
for ( Duration duration : durations )
{
    total = total.plus( duration );
}

Can streams be used in place of this for loop?

Jacob G. :

This can be achieved using the overloaded Stream#reduce method that accepts an identity:

durations.stream().reduce(Duration.ZERO, Duration::plus)

The following snippet provides an example:

var durations = List.of(Duration.ofDays(1), Duration.ofHours(1));
System.out.println(durations.stream().reduce(Duration.ZERO, Duration::plus));

As expected, the output is:

PT25H

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=348983&siteId=1