Оператор ?
, иногда называемый тернарным оператором, не нужен в Scala, поскольку он входит в состав регулярного выражения if-else
:
val x = if (condition) 1 else 2
Чтобы использовать это в map
, вы можете использовать flatMap
, а затем вернуть Option
по обе стороны от if-else
. Поскольку Option
неявно преобразуется в Iterable
, в результате список сглаживается, а Nones
фильтруются:
val statuses = tweets.flatMap(status => if (status.isTruncate) None else Some(status.getText))
Это эквивалентно использованию map
, а затем flatten
:
val statuses = tweets.map(status => if (status.isTruncate) None else Some(status.getText)).flatten
Более идиоматично, вы можете использовать collect
, что позволяет вам filter
и map
за один шаг, используя частичную функцию:
val statuses = tweets.collect {
case status if !status.isTruncate => status.getText
}
Вы также можете сделать это за 2 шага, используя filter
и map
:
val statuses = tweets.filterNot(_.isTruncate).map(_.getText)
Обратной стороной здесь является то, что это будет повторять список дважды, что может быть нежелательно. Если вы используете view
, вы можете использовать ту же логику и выполнить итерацию по списку только один раз:
val statuses = tweets.view.filterNot(_.isTruncate).map(_.getText)
person
Ben Reich
schedule
03.04.2015