2

我正在使用以下代码过滤列表:

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

类型 x 由 Scala 推断,这就是它可以找到 .getOpen() 方法的原因。

代码'x => x.getOpen()'可以提取到局部变量吗?就像是 :

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

接着 :

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

我认为这很困难,因为 .filter 方法会推断出我需要在 .filter 方法之外计算出类型的类型。也许这可以使用instaneof或替代方法来实现?

4

3 回答 3

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)
  }
}
于 2013-04-29T21:40:22.363 回答
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) )
于 2013-04-29T21:48:13.347 回答
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)

因为您实际上没有这些值,而是一个计算值的函数。

于 2013-04-29T22:24:07.210 回答