for表達(dá)式
-
for
表達(dá)式一般是for ( seq ) yield expr
,seq
是一個(gè)序列倔幼,包含有生成器、定義和過濾器诫隅,它們用分號(hào)隔開。for { p <- persons // a generator n = p.name // a definition if (n startsWith "To") // a filter } yield n
pat <- expr
逐纬,expr
通常返回一個(gè)列表。如果匹配成功肮街,模式中的變量就會(huì)成功綁定风题,如果匹配不成功,當(dāng)前元素僅僅就是被丟掉了嫉父,并不會(huì)有MatchError
拋出沛硅。
定義的格式如下:pat = expr
過濾器的格式:if expr
,過濾器會(huì)將迭代中所有讓expr
為false
的元素丟棄绕辖。for
中可以含有多個(gè)生成器摇肌,如果一個(gè)for
表達(dá)式中有多個(gè)生成器,則出現(xiàn)在后面的生成器是嵌套在前面的生成器中仪际,后面的生成器出現(xiàn)的更頻繁围小。
for
表示法本質(zhì)上跟數(shù)據(jù)庫(kù)查詢語言的通用操作是等效的。
用for推導(dǎo)式進(jìn)行翻譯
- 每個(gè)
for
表達(dá)式都可以使用map,flatMap
和withFilter
來表示树碱。for (x <- expr_1) yield expr_2 expr_1.map(x => expr_2) for (x <- expr_1 if expr_2) yield expr_3 expr_1 withFilter (x => expr2) map (x => expr3) for (x <- expr_1; y <- expr_2) yield expr_3 expr_1.flatMap(x => (y.map(y => expr3))
for
語句中肯适,yield
的表達(dá)式expr_3
是用于最后一個(gè)生成器的map
函數(shù)。剩下的生成器都是flatMap
成榜。for (x <- expr_1; y = expr_2; seq) yield expr_3 for ((x, y) <- for (x <- expr_1) yield (x, expr_2); seq) yield expr_3
for
中的定義y = expr_2
會(huì)在每一次迭代x
的時(shí)候進(jìn)行計(jì)算框舔,如果是和x
無關(guān)的變量,計(jì)算時(shí)很耗費(fèi)赎婚,最好把和x
無關(guān)的操作放在for
表達(dá)式的外面刘绣。如果是沒有yield
表達(dá)式,會(huì)直接翻譯成foreach
挣输。for (x <- expr_1) body expr_1 foreach (x => body)
map纬凤,faltMap
和withFilter
的應(yīng)用都可以使用for
表達(dá)式進(jìn)行表達(dá)。 - 由于for表達(dá)式的翻譯僅僅依賴
map撩嚼、faltMap停士、withFilter
和foreach
,則定義了這些方法的結(jié)構(gòu)也可以生成各種各樣的for
表達(dá)式完丽。 - 如果
withFilter
每次都產(chǎn)出一個(gè)序列的話向瓷,對(duì)于序列很大的情況下消耗時(shí)間很大,一般的做法返回一個(gè)"記住"元素需要被過濾的包裝對(duì)象舰涌,然后再繼續(xù)處理。