Gre*_*Cat 2 functional-programming scala scala-collections
Scala以正确的功能方式在Java中执行以下代码的最佳方法是什么?
LinkedList<Item> itemsInRange = new LinkedList<Item>();
for (int y = 0; y < height(); y++) {
for (int x = 0; x < width(); x++) {
Item it = myMap.getItemAt(cy + y, cx + x);
if (it != null)
itemsInRange.add(it);
}
}
// iterate over itemsInRange later
Run Code Online (Sandbox Code Playgroud)
当然,它可以通过命令式方式直接转换为Scala:
val itemsInRange = new ListBuffer[Item]
for (y <- 0 until height) {
for (x <- 0 until width) {
val it = tileMap.getItemAt(cy + x, cx + x)
if (!it.isEmpty)
itemsInRange.append(it.get)
}
}
Run Code Online (Sandbox Code Playgroud)
但我想以正确的,功能性的方式做到这一点.
我认为应该在map
某种2D范围内进行操作.理想情况下,map
会执行一个函数,它将获取x
并y
作为输入参数和输出Option[Item]
.在那之后,我会得到类似的结果Iterable[Option[Item]]
,flatten
它会产生Iterable[Item]
.如果我是对的,拼图中唯一缺失的部分是以某种方式在2D范围上进行地图操作.
你可以在一个很好的步骤中完成所有这些:
def items[A](w: Int, h: Int)(at: ((Int, Int)) => Option[A]): IndexedSeq[A] =
for {
x <- 0 until w
y <- 0 until h
i <- at(x, y)
} yield i
Run Code Online (Sandbox Code Playgroud)
现在说,例如,我们在四乘四的板上有符号表示:
val tileMap = Map(
(0, 0) -> 'a,
(1, 0) -> 'b,
(3, 2) -> 'c
)
Run Code Online (Sandbox Code Playgroud)
我们写道:
scala> items(4, 4)(tileMap.get)
res0: IndexedSeq[Symbol] = Vector('a, 'b, 'c)
Run Code Online (Sandbox Code Playgroud)
我认为这就是你想要的.
归档时间: |
|
查看次数: |
535 次 |
最近记录: |