在 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);
}
}
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);
}
}