Запись функций кортежей удобно в Scala

Довольно много функций на 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

Какие-либо лучшие альтернативы?

26
задан Alexey Romanov 2 June 2010 в 11:35
поделиться

6 ответов

Вы были очень близки с map.foreach (case (k, v) => println (k)) . Чтобы использовать case в анонимной функции, заключите его в фигурные скобки.

map foreach { case (k, v) => println(k) }
46
ответ дан 28 November 2019 в 06:28
поделиться
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
2
ответ дан 28 November 2019 в 06:28
поделиться

В таких случаях я часто использую синтаксис для .

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

Согласно главе 23 книги «Программирование на Scala» приведенный выше цикл for транслируется в вызов foreach .

13
ответ дан 28 November 2019 в 06:28
поделиться

Я был довольно близок к этому с последней попыткой, на самом деле:

> map.foreach({case (k, v) => println(k)})
1
3
1
ответ дан 28 November 2019 в 06:28
поделиться

Вы также можете получить доступ к кортежу следующим образом:


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
3
ответ дан 28 November 2019 в 06:28
поделиться

Альтернативой является метод с кортежем объекта Function :

import Function.tupled;
// map tupled foreach {(k, v) => println(k)}
map foreach tupled {(k, v) => println(k)}
5
ответ дан 28 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: