(質問の短いバージョンで編集)
コレクション内のいくつかのオブジェクトを部分関数で変更したいと考えています。Foreach はそれを許可しません。collect でそれを行うことはできますが、新しいコレクションの作成には副作用があり、これは避けたいと思います。
(質問の短いバージョンで編集)
コレクション内のいくつかのオブジェクトを部分関数で変更したいと考えています。Foreach はそれを許可しません。collect でそれを行うことはできますが、新しいコレクションの作成には副作用があり、これは避けたいと思います。
では、どのタイプのコレクションでもデータを変更しています。このデータ構造の例をまとめて入力しました。
case class StringData(var value: String)
case class IntData(var value: Int)
val list = Seq(StringData("something"), IntData(1), IntData(2), IntData(3))
したがって、これを行う組み込みの方法は、次のforeach
2 つのケースを使用することです。
list.foreach {
case i: IntData => i.value = i.value + 1
case _ => Unit
}
list.foreach(println)
// StringData(something)
// IntData(2)
// IntData(3)
// IntData(4)
本当に を省略したい場合はcase _ => Unit
、少し Traversable Pimpを実行できます。
implicit class TraversableExtension[T](collection: Traversable[T]) {
def foreachPf(pf: PartialFunction[T, Unit]) = collection.foreach(pf.lift)
}
list.foreachPf { case i: IntData => i.value = i.value + 1 }
list.foreach(println)
// StringData(something)
// IntData(2)
// IntData(3)
// IntData(4)
では、何がこれを機能させるのでしょうか。このlift
関数は PartialFunction を受け取り、可能な場合はそれを適用し、結果を a に返しますSome
。できない場合は、 がないときに発生するNone
ではなく、 になります。MatchError
case _ => ...