2013-04-29 60 views
1

我使用這個代碼過濾列表:如何提取過濾代碼,以局部變量

linkVOList = linkVOList.filter(x => x.getOpen().>=(100)) 

X型是由斯卡拉推斷這就是爲什麼它可以找到.getOpen()方法。

可以將代碼'x => x.getOpen()'提取到局部變量嗎?是這樣的:

val xval = 'x => x.getOpen()' 

然後:

linkVOList = linkVOList.filter(xval.>=(100)) 

我認爲這是困難的,因爲.filter方法推斷wheras我需要的.filter方法之外製定出類型的類型。也許這可以通過使用instaneof或其他方法來實現?

回答

1

有幾個方法可以做到你的要求,但兩種方式將明確必須知道對象的類型,他們正在使用:

case class VO(open:Int) 

object ListTesting { 
    def main(args: Array[String]) { 

    val linkVOList = List(VO(200)) 
    val filtered = linkVOList.filter(x => x.open.>=(100)) 

    val filterFunc = (x:VO) => x.open.>=(100) 
    linkVOList.filter(filterFunc) 

    def filterFunc2(x:VO) = x.open.>=(100) 
    linkVOList.filter(filterFunc2) 
    } 
} 
1

既然你沒有提供任何此類信息,我會隱含以下前提條件:

trait GetsOpen { def getOpen() : Int } 

def linkVOList : List[GetsOpen] 

然後你就可以提取功能是這樣的:

val f = (x : GetsOpen) => x.getOpen() 

或本:

val f : GetsOpen => Int = _.getOpen() 

而且使用這樣的:

linkVOList.filter(f.andThen(_ >= 100)) 
0

只需使用

import language.higherKinds 
def inferMap[A,C[A],B](c: C[A])(f: A => B) = f 

scala> val f = inferMap(List(Some("fish"),None))(_.isDefined) 
f: Option[String] => Boolean = <function1> 

現在,這是不是值但功能本身。如果你想要的值,只是

val opened = linkVOList.map(x => x.open) 
(linkVOList zip opened).filter(_._2 >= 100).map(_._1) 

,但如果你想要的功能,然後

val xfunc = inferMap(linkVOList)(x => x.open) 

,但你必須使用它像

linkVOList.filter(xfunc andThen { _ >= 100 }) 

linkVOList.filter(x => xfunc(x) >= 100) 

因爲你實際上並沒有價值一個計算值的函數。