如何从scala高阶方法引用对象

时间:2013-10-03 13:06:53

标签: scala

我想知道有没有办法访问在scala中调用高阶方法的对象。例如,说我有以下代码:

val list = List(1, 3, 4, -1, 2, 0)
val filtered = list filter(_ > 0)

在过滤器方法中说我想测试头值我将如何实现它?类似的东西:

val filter = list filter(_ > 0 + head)

2 个答案:

答案 0 :(得分:8)

您访问它的方式与访问filter时的方式相同:

val filter = list filter(_ > 0 + list.head)

我应该提一下,因为List是不可变的,所以你可以安全地做到这一点。

如果要在列表中链接多个操作,那么最简单的解决方案是创建中间val

val first10 = x.getList() take 10
val filter = first10 filter(_ > 0 + first10.head)

尽管我喜欢将操作链接在一起,但无论如何这通常都更具可读性。

答案 1 :(得分:0)

您始终可以将getList的结果传递给函数,例如:

scala> def getList: List[Int] = (0 to 10).toList
getList: List[Int]

scala> getList match { case (xs: List[Int]) =>
     |   xs.filter(_ > xs.head + 5)
     | }
res1: List[Int] = List(6, 7, 8, 9, 10)

或比x > 5稍微有趣的东西:

scala> def getList: List[Int] = (10 to 1 by -1).toList
getList: List[Int]

scala> getList
res6: List[Int] = List(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

scala> getList match { case (xs: List[Int]) =>
     |   xs.filter{ x => xs.head % x == 0 }
     | }
res7: List[Int] = List(10, 5, 2, 1)

注意:这适用于xs.head,因为它应该是一个非常便宜的操作,但如果你计划进一步查看列表,如xs(5)或其他东西,你会多次遍历这份名单。