Что эквивалентно этому циклу for в качестве вызовов метода?

#scala

#scala

Вопрос:

Учитывая этот код:

 for {
  evListeners <- eventListeners.get(manifest.erasure.asInstanceOf[Class[Any]])
  listener <- evListeners
} listener.asInstanceOf[A => Unit].apply(event)
  

Как я могу преобразовать это в вызовы методов? Я пробовал это, но это выдает ошибку, в то время как вышеописанное не:

 val listeners = eventListeners.get(manifest.erasure.asInstanceOf[Class[Any]])
listeners.foreach(_.asInstanceOf[A => Unit].apply(event))
  

Ответ №1:

Предполагая, что это eventListeners какой-то Map[Class[Any],Seq[Any]] вызов, вам нужно добавить один foreach вызов, так как get на этой карте появляется Option[Seq[Any]] :

 val evListeners = eventListeners.get(manifest.erasure.asInstanceOf[Class[Any]])
evListeners.foreach(_.foreach(_.asInstanceOf[A => Unit].apply(event)))
  

Комментарии:

1. О, это имеет смысл. Я предполагаю, что тогда foreach on Option выполняет итерации только по не None элементам?

2. Точно. Some(x).foreach(f) выполняет f(x) , None.foreach(f) ничего не выполняет.