我希望在 List 中找到匹配项并根据匹配项返回值。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}
我是否需要对此进行查看,或者 collectFirst 方法会确保仅根据需要创建集合?
我觉得这一定是一个相当普遍的模式。另一个例子是,如果一个人有一个主 List 元素的 List 成员,并且想要返回第四个元素(如果有的话)。有没有我可以调用的标准方法?如果失败,我可以创建以下内容:
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)