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
?
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)
vous pouvez filtrer puis mapper comme,
val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())