我只是在Scala中开始了。 我发现自己使用记录变量很多。 例如,这里的一些代码,我写道:
/* Count each letter of a string and return in a list sorted by character
* countLetter("test") = List(('e',1),('s',1),('t',2))
*/
def countLetters(s: String): List[(Char, Int)] = {
val charsListMap = s.toList.groupBy((c:Char) => c)
charsListMap.map(x => (x._1, x._2.length)).toList.sortBy(_._1)
}
是斯卡拉开发者不赞成这种语法时才元组(x._1,x._2等)?
是由斯卡拉开发者不赞成元组访问器?
简短的回答:没有。
稍长(一个字符)答:是的。
太多_n
的可以是一个代码味道,并在你的情况下,下面是更清晰,在我看来:
def countLetters(s: String): List[(Char, Int)] =
s.groupBy(identity).mapValues(_.length).toList.sortBy(_._1)
有很多类似的方法mapValues
专门设计以减少需要嘈杂的元组访问器,所以如果你发现自己写_1
等等,很多,这可能意味着你错过了一些不错的库方法。 但有时他们写的东西(例如,最终最彻底的方法_1
在我重写)。
需要注意的另一件事是,过度使用元组访问器应该朝着促进你的元组case类轻推来处理。 考虑以下:
val name = ("Travis", "Brown")
println("Hello, " + name._1)
而不是:
case class Name(first: String, last: String)
val name = Name("Travis", "Brown")
println("Hello, " + name.first)
在第二个版本的额外案件类定义购买了大量可读性为一个单一的代码行。
有一个更好的解决方案,然后x._N
。 常见的有元组的工作方式是模式匹配:
charsListMap.map{case (a, b) => (a, b.length)}
您还可以看看scalaz
,还有一些仪器的元组:
import scalaz._
import Scalaz._
scala> (1, "a") bimap (_ + 2, _ + 2)
res0: (Int, java.lang.String) = (3,a2)
scala> ('s, "abc") :-> { _.length }
res1: (Symbol, Int) = ('s,3)