У меня есть такой код с вложенными итераторами. Я хочу остановиться, выйти из foreach / map и return (value), если find возвращает и Some (value), и продолжить, если None. Какой здесь правильный подход?
Изменить: Вот полная функция
Line Schema: line_id, name
Stop Schema: stop_id, x, y
Time Schema: line_id, stop_id, time
Учитывая время и x, y, я хочу найти line_id и name. Итак, пока я застрял с получением valueWhichImTryingToGet.
def findVehicle(time: String, x: String, y: String) = {
val stopIter = Source.fromFile("stops.csv").getLines().drop(1)
val stopCols = stopIter.map(_.split(",").map(_.trim))
val stopIds = stopCols.filter(arr => arr(1) == x && arr(2) == y)
val valueWhichImTryingToGet = stopIds.map { arr =>
val iter = Source.fromFile("times.csv").getLines().drop(1)
val cols = iter.map(_.split(",").map(_.trim))
cols.find(col => col(1) == arr(0) && col(2) == time) match {
case Some(value) => value(0) //String type
case None => NotFound(s"No Vehicle available at the given time ${time}")
}
}
val lineIter = Source.fromFile("lines.csv").getLines().drop(1)
val lineCols = lineIter.map(_.split(",").map(_.trim))
lineCols.find(_(0) == valueWhichImTryingToGet ).getOrElse("No vechile can be found with the given information")
}
Также есть какие-либо улучшения в коде?
еще одна вещь, которую я заметил, это то, что если я провожу проверку длины / размера на итераторе stopIds он исчерпывает итератор, и дальнейшая обработка невозможна. Итак, как я могу узнать, вернул ли первый фильтр 0?