2016-11-27 67 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

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