リスト内で一致を見つけ、一致に応じて値を返したいと思います。CollectFirst は、コレクションの要素の照合にはうまく機能しますが、この場合、要素自体ではなく、要素のメンバー swEl で照合したいと考えています。
abstract class CanvNode (var swElI: Either[CSplit, VistaT])
{
private[this] var _swEl: Either[CSplit, VistaT] = swElI
def member = _swEl
def member_= (value: Either[CSplit, VistaT] ){ _swEl = value; attach}
def attach: Unit
attach
def findVista(origV: VistaIn): Option[Tuple2[CanvNode,VistaT]] = member match
{
case Right(v) if (v == origV) => Option(this, v)
case _ => None
}
}
def nodes(): List[CanvNode] = topNode :: splits.map(i => List(i.n1, i.n2)).flatten
//Is there a better way of implementing this?
val temp: Option[Tuple2[CanvNode, VistaT]] =
nodes.map(i => i.findVista(origV)).collectFirst{case Some (r) => r}
その上にViewが必要ですか、それともcollectFirstメソッドはコレクションが必要に応じてのみ作成されるようにしますか?
これはかなり一般的なパターンに違いないと思います。もう 1 つの例は、メイン List の要素の List メンバーがあり、4 番目の要素があればそれを返したい場合です。呼び出すことができる標準的なメソッドはありますか? 次のものを作成できない場合:
implicit class TraversableOnceRichClass[A](n: TraversableOnce[A])
{
def findSome[T](f: (A) => Option[T]) = n.map(f(_)).collectFirst{case Some (r) => r}
}
そして、上記を次のものに置き換えることができます。
val temp: Option[Tuple2[CanvNode, VistaT]] =
nodes.findSome(i => i.findVista(origV))
これは、2.10 より前の使用のために、2.10 の暗黙のクラスを使用します。
class TraversableOnceRichClass[A](n: TraversableOnce[A])
{
def findSome[T](f: (A) => Option[T]) = n.map(f(_)).collectFirst{case Some (r) => r}
}
implicit final def TraversableOnceRichClass[A](n: List[A]):
TraversableOnceRichClass[A] = new TraversableOnceRichClass(n)