Я работаю над методом, который имеет 3 возможных результата для нескольких элементов: Ошибка, Неверно и Успех. Для каждого из них мне нужно вернуть список json, определяющий, какие элементы были ошибочными, недействительными и успешными.Возврат нескольких коллекций из flatMap
Моя текущая попытка. Я использовал Object
, чтобы представить класс, который мои объекты полностью объясняют, займет слишком много времени. Object
класс имеет метод process
, который возвращает логическое значение, чтобы указать успех или ошибку и генерирует исключение, если объект является недействительным:
def process(list: List[Objects]) = {
val successIds = new ListBuffer[Int]();
val errorIds = new ListBuffer[Int]();
val invalidIds = new ListBuffer[Int]();
list.foreach(item => {
try {
if (item.process) {
successIds ++ item.id
} else {
errorIds ++ item.id
}
} catch {
case e: Exception => invalidIds ++ item.id
}
})
JsonResult(
Map("success" -> successIds,
"failed" -> errorIds,
"invalid" -> invalidIds)
)
}
Проблема использует Мутабельном структуры данных не очень «Скала-у». Я предпочел бы строить эти списки более функциональным образом, но я совершенно новый для scala. Любые мысли или подсказки о том, как это можно сделать?
Мой, хотя использует что-то вроде метода flatMap, который принимает кортеж из коллекций и сопоставляет их таким же образом, метод flatMap делает для одной коллекции:
def process(list: List[Objects]) = {
val (success, error, invalid) = list.flatMap(item => {
try {
if (item.process) {
(List(item.id), List.empty, List.empty)
} else {
(List.empty, List(item.id), List.empty)
}
} catch {
case e: Exception =>
(List.empty, List.empty, List(item.id))
}
})
JsonResult(
Map("success" -> success,
"failed" -> error,
"invalid" -> invalid)
)
}
Отметьте этот Gist, который объясняет использование аппликативных функторов для безотказной проверки, любезно предоставленной ScalaZ: https://gist.github.com/970717 – opyate