下面,在我的calculateLegalMoves
方法中,我想要为每个数组元素并行执行map
调用。我发现为了安抚编译器,我必须转换为并行数组并在执行计算后转换回正常数组。它是否正确?有更优雅的方式吗?
class Knight extends Piece {
val candidateMoveCoordinates : Array[Int] = Array(-17, -15, -10, -6, 6, 10, 15, 17)
override def calculateLegalMoves(board: Board) : Array[Move] = {
val possibleMoves : ParArray[Option[Move]] = candidateMoveCoordinates.par.map(candidate => checkLegalMove(candidate, board))
possibleMoves.toArray.flatten
}
private def checkLegalMove(x: Int, board: Board) : Option[Move] = {
//not implemented yet
None
}
}
答案 0 :(得分:2)
这两次转换没有任何办法。并行集合提供了seq
方法来返回顺序集合,但在这里它提供了ArraySeq
,这不是我们想要的。 collection.breakOut
可用于一次性执行map
和转换为其他集合类型,但在此处使用时,会强制map
按顺序执行。
但是,您可以将map
和flatten
合并在一起并使用flatMap
:
override def calculateLegalMoves(board: Board) : Array[Move] =
candidateMoveCoordinates.par.flatMap { candidate =>
checkLegalMove(candidate, board)
}.toArray