java 8 动态链接时可以使用累加器吗

标签 java java-8 java-stream

在处理 Mars Rover kata 时在 java 8 中,我们开始尝试实现最大的不变性,但我们最终陷入了这个困境:

rover = rover.move(new Commands("RFF");

...

class Rover{
...
    public Rover move(Commands commands) {
        Rover rover = this; //ignore IDE concurrency warning as Rover is designed to being immutable
        for (Command command: commands) rover = rover.move(command);
        return rover;
    }

我们认为应该可以在这里练习 Streams 语法,但我们无法弄清楚:

return commands.foreach((this, rover, command) -> rover = rover.move(command)).getAccumulator();

以“this”作为种子,流动站作为累加器,命令作为数组中的每个命令。我以为我在函数式编程培训期间用 C# 做过这种事情。但不确定:)

最佳答案

您要找的接线员是 reduce 。你可以像这样使用它:

return commands.reduce(this, Rover::move, (r1, r2) -> { throw new UnsupportedOperationException(); });

不幸的是,reduce 要求您处理值的组合,而您的系统无法做到这一点。所以在这种情况下你必须抛出异常。我认为您当前的循环解决方案很好,正如其他评论所说,不建议“仅仅因为”切换到流。

关于java 8 动态链接时可以使用累加器吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60995695/

相关文章:

java - 使用泛型创建返回较大值的 max 函数

Java 比较器接口(interface)

Java 流 - 在一次迭代中应用两个过滤器并收集到两个集合

java - 类 java.util.Arrays$ArrayList 的层次结构中没有与名称流匹配的方法

Java - 了解 Class<?> 类型以及调用 'Type.class' 时发生的情况

java集合数据结构

java - CompletableFuture 能否用于创建非阻塞 I/O 调用?

java - 如何将 list<SomeType> 转换为保留所有重复键和值的映射

java - skip() 方法是短路操作吗?

java - Shell 文件在手动运行时有效,但在 CRON 中运行时失败