4

収集メソッドOption[Set[String]]で使用しようとしているタイプのScala値があります。filter

val opt: Option[Set[String]] = ...

collection.filter {
  value =>
  opt match {
    case Some(set) => set.contains(value)
    case None => true
  }
}

opt値がである場合はSome(...)、囲まれたものを使用しSetてコレクションをフィルタリングします。それ以外の場合は、すべてのアイテムをコレクションに含めます。

Optionmap、、、filterなど)を使用するためのより良い(より慣用的な)方法はありgetOrElseますか?

opt、含める用語のリストを含むオプションのコマンドライン引数から取得されます。コマンドライン引数が欠落している場合は、すべての用語を含めます。

4

2 に答える 2

8

Set[A]定数関数を拡張して渡すという事実を使用して、次のようにA => Boolean戻ります。truegetOrElse

val p: String => Boolean = opt.getOrElse(_ => true)

または:

val p = opt.getOrElse(Function.const(true) _)

今、あなたはただ書くことができますcollection.filter(p)。ワンライナーが必要な場合は、次のいずれかが同様に機能します。

collection filter opt.getOrElse(_ => true)
collection filter opt.getOrElse(Function.const(true) _)
于 2012-05-18T12:35:54.377 に答える
6

フィルタリングするのは少しもったいないようです_ => trueので、私は好みます

opt match {
  case Some(s) => collection filter s
  case None    => collection
}

これは次のようになります。

opt map (collection filter) getOrElse collection
于 2012-05-18T13:12:41.427 に答える