从 Iterable 计算 SumOfInts

Calculate SumOfInts from Iterable

我需要计算 Iterable<Integer> 的总和。

final Iterable<Integer> score = this.points()
final sum = new SumOfInts(...).value()

如何使用 class SumOfInts 执行此操作?

如果我正确理解你的问题,你可以使用类似于此示例的代码对可迭代对象求和:;

final Iterable<Integer> score = Arrays.asList(1, 2, 3, 4);
Optional<Integer> sum = StreamSupport.stream(score.spliterator(), false).reduce((i1, i2) -> i1 + i2);
System.out.println(sum.get());

打印结果为:

10

解释:

Iterable可以转换为spliterator和spliterator to stream。然后您可以对流执行缩减。

一旦你有了流,你就可以通过多种方式解决减少问题。

另一种选择:

int summed = StreamSupport.stream(score.spliterator(), false).mapToInt(Integer::intValue).sum();
System.out.println(summed);

这可能更好,因为您去掉了 Optional 结果。

我找不到任何有关如何将 Integer 转换为 Scalar<Number> 的示例,但由于 Scalar 是一个接口,您可以执行类似的操作。

public long sum() throws Exception {
    final List<Scalar<Number>> score = this.points()
            .stream()
            .map(this::toScalar)
            .collect(Collectors.toList());
    return new SumOfInts(score).value();
}

private Scalar<Number> toScalar(final Number number) {
    return () -> number;
}

但我敢打赌有更好的方法。

由于 Cactoos 0.22 您可以:

int sum = new SumOf(1, 2, 3).intValue();