26

Scala に次のようなものはありますか?

condition ? first_expression : second_expression;

scalaのマップ関数内で使用できるのは? 私はこのようなものを書くことができるようにしたい:

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

インライン関数が使用できない場合、どのように条件を記述できますmapか?

4

2 に答える 2

44

三項演算子?と呼ばれることもある演算子は、Scala では必要ありませんif-else

val x = if (condition) 1 else 2

これを で使用するには、 のどちらかの側で を使用して返すmapことができます。は暗黙的に に変換可能であるため、結果としてリストが平坦化され、フィルタが適用されます。flatMapOptionif-elseOptionIterableNones

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
}

filterとを使用して 2 つの手順でこれを行うこともできますmap

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

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

val statuses = tweets.view.filterNot(_.isTruncate).map(_.getText)
于 2015-04-03T04:45:39.353 に答える
2

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

  val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())
于 2015-04-03T04:40:22.827 に答える