2016-09-13 47 views
1

我必須根據內部設置項目中的字段值返回true或false。我的循環如下在Scala中突破雙重foreach

myChoice.category.foreach(category => { 
    category.flavours.foreach(flavour=> { 
    if (flavour.available) true 
    }) 
}) 
false 

只要我有可用的情況,它就會中斷並返回true,但它一直返回false。任何建議?

回答

6

我沒有你的數據集可以使用,但也許這可能會這樣做。

myChoice.category.exists(_.flavours.exists(_.available)) 
3

Scala沒有continuebreak。因爲它是一個功能完備的語言,所以每個表達式(包括一個循環)都必須有一個值。此外,它試圖擺脫初始化變量並在循環過程中對它們進行變異的必要風格。相反,scala鼓勵您使用函數式樣,即使用適用於數據結構的方法作爲整體來轉換/搜索所需的結果。

對於你的情況,你很清楚看是否有任何口味的available字段設置爲true。這樣,就可以flatMap整個嵌套集合布爾的列表,並把整個集合的or

val anyAvaliable = myChoice.category.flatMap(a => a.flavours).reduce((flavour1,flavour2) => flavour1.available || flavour2.available) 

jwvh的解決方案是更加簡潔。實現基本相同的事情有很多方法。不要對抗語言,讓它爲你而戰!

1

免責聲明:提供了完整的解決方案之下,但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() 

    ... 
}