【问题标题】:Scala: why using `_` as a lambda expression body to be used as a function argument does not work?Scala:为什么使用 `_` 作为 lambda 表达式主体以用作函数参数不起作用?
【发布时间】:2018-08-20 01:11:08
【问题描述】:

例如,

scala> val a = Set(Array(1, 2),Array(8, 9))
a: scala.collection.immutable.Set[Array[Int]] = Set(Array(1, 2), Array(8, 9))

scala> a.flatMap(_)
<console>:9: error: missing parameter type for expanded function ((x$1) => a.flatMap(x$1))
              a.flatMap(_)
                        ^

scala> a.flatMap(x=>x)
res4: scala.collection.immutable.Set[Int] = Set(1, 2, 8, 9)

x=&gt;x 类型的 lambda 函数有快捷方式吗?

【问题讨论】:

  • a.flatMap(_) 需要什么?你可以使用a.flatten

标签: scala lambda functional-programming


【解决方案1】:

你可以使用简单的扁平化。

scala> val a = Set(Array(1, 2),Array(8, 9))
//a: scala.collection.immutable.Set[Array[Int]] = Set(Array(1, 2), Array(8, 9))

scala> a.flatten
//res0: scala.collection.immutable.Set[Int] = Set(1, 2, 8, 9)

scala> a.map(x => x).flatten
//res9: scala.collection.immutable.Set[Int] = Set(1, 2, 8, 9)

这里,a.map(f) 其中 f 是 A =&gt; B 需要转换函数。其他明智的类型不匹配。

【讨论】:

    【解决方案2】:

    看来你在找identity

    val a = Set(Array(1, 2) ,Array(8, 9))
    
    a.flatten
    
    a.map(identity).flatten
    

    如果你进入身份,它就像

    @inline def identity[A](x: A): A = x
    

    所以它的工作方式与x =&gt; x 相同,无论出现什么都按原样返回。

    【讨论】:

    • 谢谢。很高兴知道有一个 identity 函数。我确实有一个场景,我需要将map 一个Seq 的键值元组@ 到一个可以使用identityx=&gt;xMap 实例。
    【解决方案3】:

    由于您的标题询问为什么它不起作用,而不仅仅是如何使它起作用:错误消息会告诉您。

    _ 直接用作方法的参数时,它的范围会扩大,因此a.flatMap(_)x =&gt; a.flatMap(x)。这更经常有用:您是否希望 println(_) 始终打印 &lt;function1&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多