Подтвердить что ты не робот

Следует избегать синтаксиса x._1, x._2...?

Я только начинаю в 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)
}

Является ли этот кортеж sytax (x._1, x._2 и т.д.) недовольным разработчиками Scala?

4b9b3361

Ответ 1

Являются ли аксессоры кортежа недоверчивыми разработчиками Scala?

Короткий ответ: нет.

Немного длиннее (одним символом) ответ: да.

Слишком много _n может быть запахом кода, и в вашем случае следующее гораздо яснее, на мой взгляд:

def countLetters(s: String): List[(Char, Int)] =
  s.groupBy(identity).mapValues(_.length).toList.sortBy(_._1)

Существует множество методов, таких как mapValues, которые специально предназначены для сокращения необходимости в устройствах с помехоподавляющим набором, поэтому, если вы обнаружите, что пишете _1 и т.д., много, это, вероятно, означает, что вы Отсутствуют некоторые полезные методы библиотеки. Но иногда это самый чистый способ написать что-то (например, окончательный _1 в моей перезаписи).

Еще одна вещь, которую следует отметить, заключается в том, что чрезмерное использование аксессуаров кортежа следует рассматривать как подталкивание к продвижению ваших кортежей к классам классов. Рассмотрим следующее:

val name = ("Travis", "Brown")

println("Hello, " + name._1)

В отличие от:

case class Name(first: String, last: String)

val name = Name("Travis", "Brown")

println("Hello, " + name.first)

Определение класса дополнительного случая во второй версии покупает большую удобочитаемость для одной строки кода.

Ответ 2

Лучшее решение тогда 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)