web-dev-qa-db-ja.com

マップ関数の条件

Scalaのように、

condition ? first_expression : second_expression;

scalaのmap関数内で使用できることは?私はこのようなものを書けるようにしたいです:

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

インライン関数が不可能な場合、map内に条件を書き込むにはどうすればよいですか?

21
Lisa

?演算子は項演算子とも呼ばれ、通常のif-else式で包含されるため、Scalaでは必要ありません。

val x = if (condition) 1 else 2

これをmapで使用するには、flatMapを使用してから、if-elseのどちらかの側でOptionを返すことができます。 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を使用できます。これにより、部分関数を使用して、1つのステップでfilterおよびmapを実行できます。

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

filterおよびmapを使用して、2つのステップでこれを行うこともできます。

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

ここでの欠点は、これがリストに対して2回繰り返されることです。これは望ましくない場合があります。 viewを使用する場合、これと同じロジックを使用して、リストを1回だけ反復できます。

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

次のようにフィルタリングしてマッピングできます

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