我必須根據內部設置項目中的字段值返回true或false。我的循環如下在Scala中突破雙重foreach
myChoice.category.foreach(category => {
category.flavours.foreach(flavour=> {
if (flavour.available) true
})
})
false
只要我有可用的情況,它就會中斷並返回true,但它一直返回false。任何建議?
我必須根據內部設置項目中的字段值返回true或false。我的循環如下在Scala中突破雙重foreach
myChoice.category.foreach(category => {
category.flavours.foreach(flavour=> {
if (flavour.available) true
})
})
false
只要我有可用的情況,它就會中斷並返回true,但它一直返回false。任何建議?
我沒有你的數據集可以使用,但也許這可能會這樣做。
myChoice.category.exists(_.flavours.exists(_.available))
Scala沒有continue
或break
。因爲它是一個功能完備的語言,所以每個表達式(包括一個循環)都必須有一個值。此外,它試圖擺脫初始化變量並在循環過程中對它們進行變異的必要風格。相反,scala鼓勵您使用函數式樣,即使用適用於數據結構的方法作爲整體來轉換/搜索所需的結果。
對於你的情況,你很清楚看是否有任何口味的available
字段設置爲true
。這樣,就可以flatMap整個嵌套集合布爾的列表,並把整個集合的or
:
val anyAvaliable = myChoice.category.flatMap(a => a.flavours).reduce((flavour1,flavour2) => flavour1.available || flavour2.available)
jwvh的解決方案是更加簡潔。實現基本相同的事情有很多方法。不要對抗語言,讓它爲你而戰!
免責聲明:提供了完整的解決方案之下,但jwvh的回答應首選這種情況下,一般來講有更好的選擇。具體地,請注意,從return
拉姆達內部使用異常實現的,所以1)它可以執行比正常方法調用差得多; 2)如果你不小心,可能會意外地抓住它。
如果這是你需要的方法做的最後一件事,你可以用return
:
myChoice.category.foreach(category => {
category.flavours.foreach(flavour=> {
if (flavour.available) return true
})
})
false
如果不是的話,你可以提取的方法(包括本地一個):
def foo = {
...
val myChoice = ...
def hasAvailableFlavorsMethod() = {
myChoice.category.foreach(category => {
category.flavours.foreach(flavour=> {
if (flavour.available) return true
})
})
false
}
val hasAvailableFlavors = hasAvailableFlavorsMethod()
...
}