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

Bas*_*que 5 java immutability java-stream

java.time.DurationJava 8 及更高版本中内置的类代表了一个时间跨度,它以小时-分钟-秒为单位不附加到时间线。该类提供了plus一种对两个这样的时间跨度求和的方法。

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

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

Duration total = Duration.ZERO;
for ( Duration duration : durations )
{
    total = total.plus( duration );
}
Run Code Online (Sandbox Code Playgroud)

可以使用流代替此for循环吗?

Jac*_* G. 10

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

durations.stream().reduce(Duration.ZERO, Duration::plus)
Run Code Online (Sandbox Code Playgroud)

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

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

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

PT25H
Run Code Online (Sandbox Code Playgroud)

  • 请随意接受[Naman的回答](/sf/answers/4257141031/),因为他狙击了我大约10秒:P (2认同)

Nam*_*man 6

是的,您可以使用reduce带有标识元素的操作作为

Duration total = durations.stream()
        .reduce(Duration.ZERO, Duration::plus);
Run Code Online (Sandbox Code Playgroud)