2013-04-29 16 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) 

因为你实际上并没有价值一个计算值的函数。