我希望在列表中找到匹配並返回取決於匹配的值。 CollectFirst適用於匹配集合中的元素,但在這種情況下,我想匹配元素的成員swEl而不是元素本身。Scala:查找匹配並在集合中返回匹配相關值的通用方法
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)
headOption來自TraversableLike。 Pimping TraversableLike比PSPping TraversableOnce稍微複雜一點,所以在檢查答案之前我必須先熟練掌握。 –