scala并行数组与地图和flatten

时间:2014-07-09 20:24:43

标签: arrays scala parallel-processing implicit-conversion

下面,在我的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
  }

}

1 个答案:

答案 0 :(得分:2)

这两次转换没有任何办法。并行集合提供了seq方法来返回顺序集合,但在这里它提供了ArraySeq,这不是我们想要的。 collection.breakOut可用于一次性执行map和转换为其他集合类型,但在此处使用时,会强制map按顺序执行。

但是,您可以将mapflatten合并在一起并使用flatMap

override def calculateLegalMoves(board: Board) : Array[Move] = 
  candidateMoveCoordinates.par.flatMap { candidate =>
    checkLegalMove(candidate, board)
  }.toArray