Как преобразовать цикл Java foreach в эквивалент Scala?

2

Я пытаюсь преобразовать ниже Java-код в Scala:

Map<String, List<String>> allEntriesMap = getEntries();
for (Map.Entry<String, List<String>> allEntriesMapEntry : allEntriesMap
        .entrySet()) {
}

Вот текущая версия Scala выше кода Java:

var allEntriesMap : Map[String, List[String]] = getEntries();
for (allEntriesMap.entrySet[String, List[String]] allEntriesMapEntry :
        allEntriesMap.entrySet()) {
}

Я получаю эту ошибку для строки

for (allEntriesMap.entrySet[String, List[String]] allEntriesMapEntry : 

незаконный запуск простого шаблона

Как можно завершить код, чтобы он выполнял ту же функциональность Java, но написанную в Scala?

  • 3
    Пожалуйста, прочитайте несколько учебников, прежде чем продолжить. Копирование / вставка кода из Java в Scala - худший способ обучения.
Теги:
scala-java-interop

3 ответа

7
Лучший ответ

Проблема в том, что вы используете неправильный синтаксис. Эта

for (allEntriesMap.entrySet[String, List[String]] allEntriesMapEntry : allEntriesMap.entrySet()) {

    }

Должен быть написан как:

for (entry: Map.Entry[String, List[String]] <- allEntriesMap.entrySet()) {

}

или просто

for (entry <- allEntriesMap.entrySet) {

}

Более того, если вы используете тип коллекций java, вам нужно импортировать scala.collections.JavaConversions._ в область (которая будет неявно преобразовывать коллекции java в scala, поэтому вы можете использовать для них весь набор операций).

  • 7
    Лучше использовать JavaConverters и asScala чтобы лучше контролировать преобразования.
1

Это синтаксическая ошибка, поскольку цикл for использует в синтаксисе другой синтаксис в Scala, чем в Java. (Он не использует двоеточие для чего-либо - вместо этого использует стрелку с указателем слева).

Ваш код должен выглядеть следующим образом:

import scala.collection.JavaConversions._

for ((key, value) <- getEntries()) {
  // ...
}
0

Вы можете применить некоторую функцию для каждого элемента карты, используя функции foreach(), map() и т.д. Таким образом, вы будете иметь дело с кортежем в Scala, как с объектом Map.Entry в Java.

Например, вы можете использовать следующий код, чтобы очистить все значения на вашей карте.

var allEntriesMap : Map[String, List[String]] = getEntries()

allEntriesMap.foreach((arg: (String, List[String])) => {arg._2 = List.empty[String]})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню