マップ関数の条件
Scalaのように、
condition ? first_expression : second_expression;
scalaのmap関数内で使用できることは?私はこのようなものを書けるようにしたいです:
val statuses = tweets.map(status => status.isTruncate? //do nothing | status.getText())
インライン関数が不可能な場合、map
内に条件を書き込むにはどうすればよいですか?
?
演算子は項演算子とも呼ばれ、通常の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)
次のようにフィルタリングしてマッピングできます
val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())