flatMap - это, вероятно, то, что вы ищете, но у функции карты есть побочный эффект ведения журнала, и эти побочные эффекты могут возникнуть не сразу, если точки были видом:
val convertedPoints = points.view.flatMap { p =>
try {
Some(p.convert)
} catch {
case e : Exception =>
// Log error
None
}
}
println("Conversion complete")
println(convertedPoints.size + " were converted correctly")
Это напечатало бы:
Conversion complete
[Error messages]
x were converted correctly
В вашем случае отбросьте вид, и вы, вероятно, в порядке. :)
Чтобы преобразование было чистой функцией (без побочных эффектов), вам, вероятно, следует использовать Either. Хотя я не думаю, что это стоит усилий (если вы на самом деле не хотите что-то делать с ошибками), вот довольно полный пример использования:
case class Point(x: Double, y: Double) {
def convert = {
if (x == 1.0) throw new ConversionException(this, "x is 1.0. BAD!")
else ConvertedPoint(x, y)
}
}
case class ConvertedPoint(x: Double, y: Double)
class ConversionException(p: Point, msg: String) extends Exception(msg: String)
val points = List(Point(0,0), Point(1, 0), Point(2,0))
val results = points.map { p =>
try {
Left(p.convert)
} catch {
case e : ConversionException => Right(e)
}
}
val (convertedPoints, errors) = results.partition { _.isLeft }
println("Converted points: " + convertedPoints.map(_.left.get).mkString(","))
println("Failed points: " + errors.map( _.right.get).mkString(","))