web-dev-qa-db-fra.com

Condition dans la fonction de carte

Y a-t-il quelque chose dans Scala comme,

condition ? first_expression : second_expression;

que je peux utiliser dans la fonction de carte dans scala? Je veux pouvoir écrire quelque chose comme ça:

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

Si la fonction inline n'est pas possible, comment puis-je écrire une condition dans map?

21
Lisa

Le ?, parfois appelé opérateur ternaire n'est pas nécessaire dans Scala, car il est subsumé par un if-else expression:

val x = if (condition) 1 else 2

Pour l'utiliser dans un map, vous pouvez utiliser flatMap puis renvoyer un Option de chaque côté du if-else. Puisque Option est implicitement convertible en Iterable, l'effet est que la liste est aplatie et les Nones sont filtrés:

val statuses = tweets.flatMap(status => if (status.isTruncate) None else Some(status.getText))

Cela équivaut à utiliser map puis flatten:

val statuses = tweets.map(status => if (status.isTruncate) None else Some(status.getText)).flatten

Plus idiomatiquement, vous pouvez utiliser collect, qui vous permet de filter et map en une seule étape en utilisant une fonction partielle:

val statuses = tweets.collect {
    case status if !status.isTruncate => status.getText
}

Vous pouvez également le faire en 2 étapes en utilisant filter et map:

val statuses = tweets.filterNot(_.isTruncate).map(_.getText)

L'inconvénient ici est que cela répétera deux fois la liste, ce qui peut être indésirable. Si vous utilisez view, vous pouvez utiliser cette même logique et ne parcourir la liste qu'une seule fois:

val statuses = tweets.view.filterNot(_.isTruncate).map(_.getText)
36
Ben Reich

vous pouvez filtrer puis mapper comme,

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