Ответ 1
Оператор ?
, иногда называемый тернарным оператором, не нужен в 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)