Scala 斯卡拉。具有短语法的嵌套lambda的参数
请原谅我的英语:( 让我们用例子来解释我的问题。我们有一个数组Scala 斯卡拉。具有短语法的嵌套lambda的参数,scala,lambda,functional-programming,Scala,Lambda,Functional Programming,请原谅我的英语:( 让我们用例子来解释我的问题。我们有一个数组a: var a = Array(1,1,1,1,2) a.filter( _ < 2 ) 我们可以: 过滤器a: var a = Array(1,1,1,1,2) a.filter( _ < 2 ) 问题是:如何在不引入变量i的情况下执行第三分句?是否可以编写如下内容: a.filter ( a.count ( _ == __) == 1 ) 我知道我可以写这篇文章(它仍然很短): 但
a
:
var a = Array(1,1,1,1,2)
a.filter( _ < 2 )
我们可以:
a
:
var a = Array(1,1,1,1,2)
a.filter( _ < 2 )
a.filter ( a.count ( _ == __) == 1 )
我知道我可以写这篇文章(它仍然很短):
但是我只是对答案感兴趣。如果不引入变量
I
,就无法做到这一点,因为它需要混合来自两个不同作用域的变量(称为a)。如果我们在编写这篇文章时不使用\u
占位符变量,这一点会变得更清楚
a.filter( outer =>
a.count( inner =>
outer == inner
) == 1
)
对于a
中outer
的每个值,我们正在创建一个传递到count
的新函数,其中outer
是常量,internal
作为参数传入。\uucode>只能作为它所使用的最内部函数的占位符,因此不能用于替换outere> .这就是为什么
a.filter( outer =>
a.count(
outer == _
) == 1
)
编译但是
a.filter(
a.count( inner =>
_ == inner
) == 1
)
不可以。如果不引入变量i
,则无法执行此操作,因为它需要混合来自两个不同范围(称为a)的变量。如果我们在编写此文件时不使用\u
占位符变量,则会变得更清晰
a.filter( outer =>
a.count( inner =>
outer == inner
) == 1
)
对于a
中outer
的每个值,我们正在创建一个传递到count
的新函数,其中outer
是常量,internal
作为参数传入。\uucode>只能作为它所使用的最内部函数的占位符,因此不能用于替换outere> .这就是为什么
a.filter( outer =>
a.count(
outer == _
) == 1
)
编译但是
a.filter(
a.count( inner =>
_ == inner
) == 1
)
没有。仅提及另一种解决方案(我想不是更简单,而是更快)
仅提及另一种解决方案(我想不是更简单,而是更快)
或者xs groupBy identity collect{case(k,v)if v.size==1=>k}
或者(更快更复杂):a.foldLeft(collection.mutable.Map[Any,Int]()。withDefaultValue(0))((m,x)=>{m(x)+=1;m})。过滤器(u 2==1)。键
。实际上,对于70个或更多元素的列表,只会更快。或者xs groupBy identity collect{case(k,v)if v.size==1=>k}
或(更快更复杂):a.foldLeft(collection.mutable.Map[Any,Int]()。withDefaultValue(0))((m,x)=>{m(x)+=1;m}).过滤器(u.\u 2==1).键
。但实际上,对于70个或更多元素的列表,只会更快。