您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關為什么使用Kotlin:forEach也可以break和continue,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
詳解Kotlin:forEach也能break和continue
這樣的問題。也就是說,他們想用forEach而不是for循環,因為這很fp,很洋氣(我也喜歡),
但是他們又想使用break和continue,也就是普通的流程控制語句中的控制語句。
這很不fp,因為原本有filter是用于完成這個工作的,還有flapMap。BennyHuo在他發的文章里面也說的是這種方法。
filter很fp,但是會導致兩次遍歷,這樣的話給人一股效率很低的趕腳。而Java8的Stream API就只會遍歷一次,
而且很fp。但是它會有lambda對象的產生而且實現超復雜(我沒看過,不清楚),而Kotlin的集合框架可是能inline掉lambda的,
少產生了多少對象啊,怎么能和辣雞Java同流合污呢?
有人提到使用label return,比如:
fun main(ags: Array<String>) { (0..100).forEach { if (50 <= it) return@forEach println(it) } }
但是他做了實驗之后發現這玩意只能相當于continue,也就是說你只能跳出當前循環,然后還是會繼續下一輪。
講道理這個你仔細想想就可以發現。為了搞清楚其中的道理,我們自己實現一個forEach。
fun Pair<Int, Int>.forEach(block: (Int) -> Unit) { for (i in first..second) block.invoke(i) }
然后調用一下:
Pair(1, 100).forEach(::println)
沒毛病老鐵。
然后你會發現,你在函數體內對block產生了(second - first)次調用,不論你怎么return,都只會跳出這個block,
它并不影響你之后繼續調用這個block,也就是說這個for循環不受block行為的影響。
看起來無解了,那怎么辦呢?
那么就讓我來拯救你們吧。
fun main(ags: Array<String>) { run outside@ { (0..20).forEach inside@ { if (10 <= it) return@outside println(it) } } }
編譯之后運行結果:
0 1 2 3 4 5 6 7 8 9 Process finished with exit code 0
吶,跳出去了。
把label的名字起的清真一點,就是這樣:
run breaking@ { (0..20).forEach continuing@ { if (10 <= it) return@breaking println(it) } }
上面這是break,運行結果就上面那樣。
下面這是continue,運行結果就是continue的效果。為了讓效果表現的明顯,我把println復制了一下,
分別在if前后,這樣可以很清楚地看到效果。
run breaking@ { (0..20).forEach continuing@ { print(it) if (10 <= it) return@continuing println(it) } }
運行一下:
00 11 22 33 44 55 66 77 88 99 1011121314151617181920 Process finished with exit code 0
而且只進行了一次迭代,非常清真,效率看起來也比較高。
如何證明只有一次迭代?我使用jd-gui逆向了剛才的代碼,結果:
public final class _5Kt { public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); int $i$a$1$run; Iterable $receiver$iv = (Iterable)new IntRange(0, 20); int $i$f$forEach; for (Iterator localIterator = $receiver$iv.iterator(); localIterator.hasNext();) { int element$iv = ((IntIterator)localIterator).nextInt();int it = element$iv; int $i$a$1$forEach; System.out.print(it); if (10 <= it) { break; } System.out.println(it); } } }
上述就是小編為大家分享的為什么使用Kotlin:forEach也可以break和continue了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。