2016-11-27 53 views
2

我是斯卡拉集的新手。我試圖將一個Set與一個空Set連接起來。代碼如下:斯卡拉的空集:...不符合預期的類型集[Nothing]

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = { 
    preferences.foldLeft(Set.empty){(r,c) => c match { 
    case (_, li) => li.toSet ++ r 
    case _ => r 
    }} 
} 

的錯誤,當我試圖做li.toSet ++ r,抱怨... doesn't conform to expected type Set[Nothing]發生。然後,我不知道如何建立一個從空的一個開始。

謝謝大家。

+1

到底是什麼'...'? – Bergi

+0

@Bergi'...'是'Slot'類型的詳細類型。謝謝 –

回答

4

你必須幫助編譯器推斷正確的類型,它沒有足夠的信息來找出你的意思是Set[Slot]empty需要一個類型參數:

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = { 
    preferences.foldLeft(Set.empty[Slot]){(r,c) => c match { 
    case (_, li) => li.toSet ++ r 
    case _ => r 
    }} 
} 
+0

非常感謝!我剛剛嘗試過,它的作用像魅力! :) –

2

簡單利落的解決方案

preferences.valuesIterator.flatten.toSet 

獲取優惠的所有值映射使用valuesIterator然後flatten,然後轉換爲使用設置功能。

getAllSlots功能變得

def getAllSlots(preferences: Map[Band, List[Slot]]): Set[Slot] = 
    preferences.valuesIterator.flatten.toSet 
+0

'valuesIterator'會更好,所以你不要構造不必要的中間集合。 –

+0

@AlexeyRomanov謝謝你的建議,將它改爲valuesIterator – pamu

+1

哇,真好。感謝更高效的方式! –