在处理 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/