2012-12-06 60 views
2

我想下面的Java代碼轉換爲斯卡拉:如何轉換Scala等效Java Java foreach循環?

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

這裏是上面的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複製/粘貼代碼是最糟糕的學習方式。 – paradigmatic

回答

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'來更好地控制轉換。 – drexin

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]}) 
1

這是一個語法錯誤,因爲for循環使用Scala中不同的語法比它在Java中。 (它不使用冒號的任何東西 - 它使用向左的箭頭代替。)

您的代碼應該如下所示:

import scala.collection.JavaConversions._ 

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