【问题标题】:Writing functions of tuples conveniently in Scala在 Scala 中方便地编写元组函数
【发布时间】:2011-02-26 18:53:23
【问题描述】:

Map 上的很多函数都将键值元组上的函数作为参数。例如。 def foreach(f: ((A, B)) ⇒ Unit): Unit。所以我找了一个简短的方法来给foreach写一个论点:

> val map = Map(1 -> 2, 3 -> 4)

map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)

> map.foreach((k, v) => println(k))

error: wrong number of parameters; expected = 1
       map.foreach((k, v) => println(k))
                          ^

> map.foreach({(k, v) => println(k)})

error: wrong number of parameters; expected = 1
       map.foreach({(k, v) => println(k)})
                           ^

> map.foreach(case (k, v) => println(k))

error: illegal start of simple expression
       map.foreach(case (k, v) => println(k))
                   ^

我可以的

> map.foreach(_ match {case (k, v) => println(k)})

1
3

还有更好的选择吗?

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    您与map.foreach(case (k, v) => println(k)) 关系密切。要在匿名函数中使用case,请用大括号括起来。

    map foreach { case (k, v) => println(k) }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,我经常使用for 语法。

      for ((k,v) <- map) println(k)
      

      根据“Scala 编程”中的第 23 章,上述 for 循环被转换为调用 foreach

      【讨论】:

      • 请注意:如果他想通过这种方法使用flatMap,则应使用单独的flatten
      • 很多时候使用foreach 更实用。如果您发现自己这样做了,那么可能可以进行一些抽象。
      【解决方案3】:

      另一种方法是Function 对象的tupled 方法:

      import Function.tupled;
      // map tupled foreach {(k, v) => println(k)}
      map foreach tupled {(k, v) => println(k)}
      

      【讨论】:

      • @Rahul map foreach Function.tupled((k,v) =&gt; println(k))map foreach ((k : Int,v : Int) =&gt; println(k)).tupled 会。
      • @Thomas,哦,不知道。谢谢。
      • 是的,对不起,我不小心交换了tupled 和函数调用。我会改的。
      • 一个聪明的解决方案。我不知道这一点,现在我学到了一些东西。谢谢!
      • 是否有理由使用它而不是接受的答案(Ben Lings)?
      【解决方案4】:

      您还可以按如下方式访问元组:

      
      scala> val map = Map(1 -> 2, 3 -> 4)
      map: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4))
      scala> map foreach (t => println(t._1))
      1
      3
      

      【讨论】:

      • 是的,忘记添加该选项。但我不喜欢它,因为在这种情况下,元组的字段确实具有实际意义(键和值),我想在我的代码中反映它。
      【解决方案5】:
      Welcome to Scala version 2.8.0.Beta1-prerelease (OpenJDK Server VM, Java 1.6.0_0).
      Type in expressions to have them evaluated.
      Type :help for more information.
      
      scala> val m = Map('a -> 'b, 'c -> 'd)
      m: scala.collection.immutable.Map[Symbol,Symbol] = Map('a -> 'b, 'c -> 'd)
      
      scala> m foreach { case(k, v) => println(k) }
      'a
      'c
      

      【讨论】:

        【解决方案6】:

        实际上,我与最后一次尝试非常接近:

        > map.foreach({case (k, v) => println(k)})
        1
        3
        

        【讨论】:

        • 请注意,您不需要最外面的圆括号()。就foreach{case (k,v)=&gt; ???}
        猜你喜欢
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 1970-01-01
        相关资源
        最近更新 更多