Подробная запись при использовании map () в списках кортежей - PullRequest
19 голосов
/ 02 апреля 2012

Мне нравится, когда мой код читается наивно.

Если я настрою простой список кортежей:

scala> val a = List(6, 8, 10)
a: List[Int] = List(6, 8, 10)

scala> val b = a zipWithIndex
b: List[(Int, Int)] = List((6,0), (8,1), (10,2))

Я бы хотел отобразить () в Списке, но мне трудно понять синтаксис ._1 ._2:

scala> val c = b map ( a => if(a._1 > 8) a._1 else a._2 )           
c: List[Int] = List(0, 1, 10)

Чтобы назвать имя кортежа, я использовал:

scala> val c = b map ( { case (num, i) => if(num > 8) num else i } )
c: List[Int] = List(0, 1, 10)

Два вопроса:

1) Есть ли более краткий способ назвать членов кортежа?

2) Имеется ли значительное снижение производительности для моей версии выше (она используется в умеренно критичном для производительности коде).

Спасибо.

Ответы [ 2 ]

20 голосов
/ 03 апреля 2012
b map Function.tupled((num, i) => if(num > 8) num else i)

избегает сопоставления с образцом и for-выражений, поэтому должно быть достаточно производительным. Я обычно просто использую case, как вы, хотя.

8 голосов
/ 02 апреля 2012

В этом случае вы можете найти эквивалентный синтаксис для понимания более читабельным, но это действительно вопрос вкуса ...

for {(num, i) <- b} yield if(num >8) num else i

FWIW, я попытался сравнить карту с сопоставлением с шаблоном и без него, и у меня было примерно одинаковое время выполнения.

Код, который я использовал:

object bench extends scala.testing.Benchmark {
    var b:List[(Int, Int)] = _

    override def setUp {
        val a = (1000000 to 2000000).toList
        b = a zipWithIndex
    }

    def run = b map ( a => if(a._1 > 8) a._1 else a._2 )
 }

Я также создал другое приложение с объектом bench1, который имеет только версию карты с сопоставлением с шаблоном вместо ._1 и ._2. Результаты на моем старом нетбуке (scala 2.9.1, xubuntu 11.10):

$ scala bench 10 
bench$   750    758 731 721 733 736 725 743 735 736
$ scala bench1 10
bench1$  774    772 740 724 745 730 711 739 740 740
...