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 )
    
  • 问题是:如何在不引入变量i的情况下执行第三分句?是否可以编写如下内容:

        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个或更多元素的列表,只会更快。