Условие в функции отображения

есть что-нибудь в Scala как

condition ? first_expression : second_expression;

который я могу использовать в функции карты в scala? Я хочу написать что-то вроде этого:

val statuses = tweets.map(status => status.isTruncate? //do nothing | status.getText())

Если встроенная функция невозможна, как я могу написать условие в карте?

Ответ 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)

Ответ 2

вы можете фильтровать, а затем отображать как,

  val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())