Scala, эквивалентный из map.each Ruby?

Очень удобный код Ruby:

some_map.each do |key,value|
  # do something with key or value
end

Эквивалентный Scala:

someMap.foreach( entry => {
  val (key,value) = entry
  // do something with key or value
})

Необходимость добавить дополнительное val строка прослушивает меня. Я не мог выяснить, как заявить функциональный аргумент для извлечения кортежа, таким образом, я задаюсь вопросом, там способ сделать это, или почему не там никакой foreach, который извлекает ключ и значение для меня?

11
задан davetron5000 6 February 2010 в 21:52
поделиться

4 ответа

Это тоже работает:

someMap.foreach {case (key, value) =>
  // do something with key and/or value
}
19
ответ дан 3 December 2019 в 01:44
поделиться

Мне нравится этот:

scala> val foo = Map( 1 -> "goo", 2 -> "boo" )
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo)

scala> for ((k,v) <- foo) println(k + " " + v)
1 goo
2 boo
11
ответ дан 3 December 2019 в 01:44
поделиться

Function.tupled преобразует функцию (a1, a2) => b) в функцию ((a1, a2)) => b.

import Function._
someMap foreach tupled((key, value) => printf("%s ==> %s\n", key, value))
2
ответ дан 3 December 2019 в 01:44
поделиться

Вам не нужен даже val в цикле for:

Следуя примеру Виктора Кланга:

scala> val foo = Map( 1 -> "goo", 2 -> "boo" )
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo)

scala> for ((k, v) <- foo) println(k + " " + v)
1 goo
2 boo

Обратите внимание, что for довольно мощный инструмент в Scala, поэтому вы также можете использовать его для понимания последовательностей :

scala> val bar = for (val (k, v) <- foo) yield k
bar: Iterable[Int] = ArrayBuffer(1, 2)
5
ответ дан 3 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

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