拜托,对不起我的英文:(
让我们通过例子来解释我的问题。我们有一个数组a
:
var a = Array(1,1,1,1,2)
我们可以:
过滤a
:
a.filter( _ < 2 )
计算a:
中的一些元素a.count (_ < 2)
获取集合中的唯一元素:
a.filter { i =>
a.count(_ == i) == 1
}
问题是:如何做第三个子句但不引入变量i?是否可以写出类似的东西:
a.filter ( a.count ( _ == __) == 1 )
我知道我可以写这个(它仍然很短):
a.filter { i => a.count(_ == i) == 1 }
但我只是对答案感兴趣。
答案 0 :(得分:4)
如果不引入变量i
,则无法执行此操作,因为它需要混合来自两个不同范围的变量(即closure)。如果我们在不使用_
占位符变量的情况下编写此代码,则会变得更加清晰。
a.filter( outer =>
a.count( inner =>
outer == inner
) == 1
)
对于outer
中a
的每个值,我们正在创建一个新函数以传递给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