斯卡拉。具有短语法的嵌套lambdas的参数

时间:2013-11-11 21:18:57

标签: scala lambda functional-programming

拜托,对不起我的英文:( 让我们通过例子来解释我的问题。我们有一个数组a

    var a = Array(1,1,1,1,2)

我们可以:

  1. 过滤a

    a.filter( _ < 2 )
    
  2. 计算a:

    中的一些元素
    a.count (_ < 2)
    
  3. 获取集合中的唯一元素:

    a.filter { i =>
        a.count(_ == i) == 1
    }
    
  4. 问题是:如何做第三个子句但不引入变量i?是否可以写出类似的东西:

        a.filter ( a.count ( _ == __) == 1 )
    

    我知道我可以写这个(它仍然很短):

        a.filter { i => a.count(_ == i) == 1 }
    

    但我只是对答案感兴趣。

2 个答案:

答案 0 :(得分:4)

如果不引入变量i,则无法执行此操作,因为它需要混合来自两个不同范围的变量(即closure)。如果我们在不使用_占位符变量的情况下编写此代码,则会变得更加清晰。

a.filter( outer =>
  a.count( inner =>
    outer == inner
  ) == 1
)

对于outera的每个值,我们正在创建一个新函数以传递给count,其中outer是常量而inner是作为参数传入。 _只能作为其所使用的最内层函数的占位符,因此不能用于替换outer。这就是为什么

a.filter( outer =>
  a.count(
    outer == _
  ) == 1
)

编译,但

a.filter(
  a.count( inner =>
    _ == inner
  ) == 1
)

没有。

答案 1 :(得分:0)

提一个替代解决方案(不是更简单,但我认为更快)

a.groupBy(identity).filter{ case (_, v) => v.size == 1}.keys