在 Java 中使用流对一组不可变的“Duration”对象求和

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

Java 8 及更高版本中内置的 java.time.Duration class 表示时间跨度,该时间跨度与时分秒的时间轴无关。 class 提供了一种 plus 方法来对两个这样的时间跨度求和。

java.timeclasses 使用不可变对象。因此 Duration::plus 方法 returns 一个新的第三个 Duration 对象作为结果而不是改变(变异)任何一个输入对象。

Duration 个对象的集合求和的常规语法如下。

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

能否使用流代替此 for 循环?

是的,您可以使用 reduce 操作,身份元素为

Duration total = durations.stream()
        .reduce(Duration.ZERO, Duration::plus);

这可以使用接受身份的重载 Stream#reduce 方法来实现:

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

以下代码段提供了一个示例:

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

正如预期的那样,输出是:

PT25H

这是一个带有示例输入的完整示例。您需要在 java 流中使用 reduce 函数。这是我用过的short tutorial

import java.time.Duration;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class DurationTest {
    public static void main(String [] args){
        List<Duration> durations = IntStream
                .rangeClosed(1, 10)
                .mapToObj( n -> Duration.ofSeconds(n) )
                .collect(Collectors.toList());

        int sumOfSeconds = (10 * (1 + 10) ) / 2;

        Duration total = durations.stream().reduce( Duration.ZERO, (t, d) -> t = t.plus(d) );
        System.out.printf("actual = %s, expected = %s", total.getSeconds(), sumOfSeconds);
    }
}