如何在Scala等效中转换Java foreach循环?

时间:2012-12-06 14:20:53

标签: java scala scala-java-interop

我正在尝试将以下Java代码转换为Scala:

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

以上是Java代码的当前Scala版本:

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 个答案:

答案 0 :(得分: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集合,因此您可以对它们使用所有操作集。)

答案 1 :(得分:1)

这是一个语法错误,因为for循环在Scala中使用的语法与在Java中使用的语法不同。 (它不使用冒号 - 它使用左箭头代替。)

您的代码应如下所示:

import scala.collection.JavaConversions._

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

答案 2 :(得分:0)

您可以使用foreach(),map()等函数为地图的每个元素应用一些函数。因此,您将使用Java中的Map.Entry对象处理Scala中的元组。

E.g。您可以使用以下代码刷新地图中的所有值。

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

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