国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

            當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > List.foreach詳解

            List.foreach詳解

            來(lái)源:千鋒教育
            發(fā)布人:xqq
            時(shí)間: 2023-11-23 14:52:27 1700722347

            一、List.foreach數(shù)據(jù)表

            List.foreach是Scala集合庫(kù)中非常常用的方法,在列表、數(shù)組、集合等數(shù)據(jù)結(jié)構(gòu)上都得到了廣泛應(yīng)用。這個(gè)方法非常重要,因此我們建立一張表格來(lái)展示List.foreach在不同數(shù)據(jù)結(jié)構(gòu)上的表現(xiàn):

            數(shù)據(jù)結(jié)構(gòu) 表現(xiàn)
            List 對(duì)List中的每個(gè)元素執(zhí)行指定的操作
            Array 對(duì)Array中的每個(gè)元素執(zhí)行指定的操作
            Map 對(duì)Map中的每個(gè)鍵值對(duì)執(zhí)行指定的操作
            Set 對(duì)Set中的每個(gè)元素執(zhí)行指定的操作
            Stream 對(duì)Stream中的每個(gè)元素執(zhí)行指定的操作

            二、List.foreach和for循環(huán)

            Scala中也可以使用for循環(huán)對(duì)列表進(jìn)行迭代,然而使用List.foreach方法要比f(wàn)or循環(huán)更為簡(jiǎn)潔、優(yōu)美。下面是一個(gè)簡(jiǎn)單的示例:

            
            val list = List(1, 2, 3, 4, 5)
            list.foreach(e => println(e))
            for (e <- list) println(e)
            

            list.foreach(e => println(e))的意思是對(duì)list中的每個(gè)元素e執(zhí)行println(e)操作。而for循環(huán)則要寫(xiě)成for(e <- list) println(e)??雌饋?lái),List.foreach要比f(wàn)or循環(huán)更加簡(jiǎn)潔明了。

            三、List.foreach和Stream.foreach

            Scala標(biāo)準(zhǔn)庫(kù)中,只有Stream使用了類(lèi)似于惰性求值的技術(shù),其他的集合都是嚴(yán)格求值,但是在不同情境下,Stream的惰性求值有時(shí)可能會(huì)造成一定的影響。舉個(gè)例子,讓我們來(lái)看一下對(duì)一個(gè)List和一個(gè)Stream進(jìn)行操作:

            
            val list = List(1,2,3,4,5,6,7,8,9,10)
            val stream = Stream.from(1).take(10)
            list.foreach(println)
            stream.foreach(println)
            

            上述代碼會(huì)輸出列表中的十個(gè)數(shù)和Stream中的無(wú)限序列,這種情況下使用List和Stream的foreach方法沒(méi)有什么區(qū)別。但是,讓我們考慮對(duì)這兩種數(shù)據(jù)結(jié)構(gòu)進(jìn)行篩選操作的情況:

            
            val list = List(1,2,3,4,5,6,7,8,9,10)
            val stream = Stream.from(1)
            println(list.filter(_%2 == 0))
            println(stream.filter(_%2 == 0).take(10))
            

            上述代碼會(huì)篩選出列表中的偶數(shù),并輸出以2為步長(zhǎng)的無(wú)限序列的前10個(gè)偶數(shù)。這里,Stream的惰性求值機(jī)制使得其可以對(duì)無(wú)限序列進(jìn)行操作,而對(duì)于列表,則需要將整個(gè)列表篩選一遍,再輸出結(jié)果。因此,當(dāng)需要對(duì)無(wú)限或非常大的序列進(jìn)行操作時(shí),使用Stream.foreach方法更為合適。

            四、List.foreach中的break

            Scala中,List.foreach方法是不支持break的,但是我們可以通過(guò)拋異常來(lái)中斷foreach的執(zhí)行,這個(gè)做法也被稱(chēng)為“異常跳轉(zhuǎn)”。下面是一個(gè)示例:

            
            import scala.util.control.Breaks._
            val list = List(1,2,3,4,5,6,7,8,9,10)
            breakable {
              for (i <- list) {
                if (i > 5) break()
                println(i)
              }
            }
            

            這段代碼會(huì)輸出1至5的整數(shù)。breakable方法會(huì)將其內(nèi)部的代碼塊作為一個(gè)整體,在內(nèi)部執(zhí)行break方法時(shí),將拋出一個(gè)BreakControl異常,從而中斷循環(huán)。然而,這種做法的可讀性和健康性都值得商榷,因?yàn)樗男袨槠蛴诓环€(wěn)定和難以維護(hù)。

            五、List.foreach跳出循環(huán)

            如果我們需要在List.foreach循環(huán)中跳出循環(huán),可以使用return語(yǔ)句。下面是一個(gè)示例:

            
            val list = List(1,2,3,4,5,6,7,8,9,10)
            list.foreach(item => {
              if (item == 5) return
              println(item)
            })
            

            上述代碼將輸出整數(shù)1到4,當(dāng)循環(huán)執(zhí)行到5時(shí),會(huì)跳出循環(huán)而直接返回上層函數(shù)。然而在使用return語(yǔ)句時(shí),必須將其放在foreach方法的代碼塊中,在Scala中即便在lambda式中使用return也會(huì)直接報(bào)錯(cuò)。

            六、List.foreach移除對(duì)象

            在遍歷一個(gè)List時(shí),如果需要移除某個(gè)元素,可以使用List.filterNot方法或者List.cloneDropWhile方法。下面是一個(gè)示例:

            
            val list = scala.collection.mutable.ListBuffer(1,2,3,4,5)
            list.foreach(item => {
              if (item % 2 == 0) list -= item
            })
            println(list.toList)
            

            上述代碼中我們將1至5的整數(shù)存到ListBuffer中,遍歷這個(gè)ListBuffer,如果其中的一個(gè)數(shù)是偶數(shù),則將其從ListBuffer中移除。最終將剩余的數(shù)字輸出。 ListBuffer支持移除元素的操作,這樣遍歷時(shí)就可以方便的實(shí)現(xiàn)對(duì)元素的移除操作。

            七、List.foreach詳解

            在Scala中用foreach方法來(lái)遍歷一個(gè)List的元素十分簡(jiǎn)單易懂,即:對(duì)于一個(gè)List列表,我們可以對(duì)它使用foreach方法來(lái)遍歷其中的每個(gè)元素,并對(duì)每個(gè)元素執(zhí)行一個(gè)指定的操作。下面是一個(gè)示例:

            
              val list = List("apple","banana","orange","watermelon")
              list.foreach(fruit => println(fruit))
            

            除了上述的語(yǔ)法外,Scala也允許我們通過(guò)方法引用的方式來(lái)指定操作。通常我們使用lambda表達(dá)式來(lái)指定一個(gè)操作,但我們也可以使用方法引用。舉個(gè)例子,如果我們定義如下的一個(gè)方法:

            
              def printFruit(fruit: String) = println(fruit)
            

            那么我們就可以通過(guò)方法名的方式來(lái)引用它,并在foreach方法中使用

            
              val list = List("apple","banana","orange","watermelon")
              list.foreach(printFruit)
            

            八、List.foreach能用break中斷嗎

            前文提到,List.foreach方法并不支持break的使用。但我們也可以借助Scala中的一些函數(shù)式方法來(lái)將foreach轉(zhuǎn)為其他形式的方法。例如可以使用takeWhile來(lái)實(shí)現(xiàn)循環(huán)終止的效果。

            
            val list = List(1,2,3,4,5,6,7,8,9,10)
            list.takeWhile(item => {
              if (item > 5) false
              else {
                println(item)
                true
              }
            })
            

            上述代碼輸出了1~5的整數(shù),并在6處終止了循環(huán)。其中,takeWhile方法的作用是保留滿(mǎn)足條件的元素,一旦遇到不滿(mǎn)足條件的元素就結(jié)束整個(gè)遍歷。我們可以將截止策略存放在takeWhile方法的lambda表達(dá)式中,然后在該表達(dá)式中通過(guò)if-else控制何時(shí)退出遍歷。這種方式可以避免throw異常的情況,同時(shí)代碼也更為優(yōu)美易讀。

            九、List.foreach內(nèi)存泄漏

            在Scala中,如果在遍歷一個(gè)List操作時(shí),執(zhí)行的任務(wù)有明顯的副作用,并且列表非常長(zhǎng),那么很容易就出現(xiàn)內(nèi)存泄漏的情況。例如下面這個(gè)示例:

            
            val list = List.range(1, 1000000)
            list.foreach(item => item * 2)
            

            雖然上述代碼只是簡(jiǎn)單地對(duì)每個(gè)元素乘2,但在實(shí)際執(zhí)行時(shí),它會(huì)消耗掉大量?jī)?nèi)存。這是因?yàn)樵赟cala中,一般來(lái)說(shuō),執(zhí)行一些操作時(shí),都會(huì)生成一些中間數(shù)據(jù)并保留在內(nèi)存中。而這些中間數(shù)據(jù)會(huì)占用大量的內(nèi)存。這樣的問(wèn)題可以使用Stream避免,另一種方法是使用Iterator方法,它可以按需生成數(shù)據(jù)。

            
            val list = List.range(1, 1000000)
            list.iterator.foreach(item => item * 2)
            

            上述代碼使用了list.iterator方法而不是list.foreach方法,這樣就可以實(shí)現(xiàn)每次只生成一個(gè)元素,在其它地方不存儲(chǔ)任何數(shù)據(jù)。這樣,在數(shù)據(jù)量比較大時(shí),我們可以選擇使用Iterator來(lái)遍歷。

            tags: listforeach
            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
            請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
            免費(fèi)領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學(xué) 138****2860 剛剛成功領(lǐng)取
            王同學(xué) 131****2015 剛剛成功領(lǐng)取
            張同學(xué) 133****4652 剛剛成功領(lǐng)取
            李同學(xué) 135****8607 剛剛成功領(lǐng)取
            楊同學(xué) 132****5667 剛剛成功領(lǐng)取
            岳同學(xué) 134****6652 剛剛成功領(lǐng)取
            梁同學(xué) 157****2950 剛剛成功領(lǐng)取
            劉同學(xué) 189****1015 剛剛成功領(lǐng)取
            張同學(xué) 155****4678 剛剛成功領(lǐng)取
            鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
            董同學(xué) 138****2867 剛剛成功領(lǐng)取
            周同學(xué) 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            JavaLabel全方位詳解

            一、JavaLabel概述JavaLabel是一種Java圖形用戶(hù)界面(GUI)組件,用于在Swing應(yīng)用程序中顯示文本和圖像。JavaLabel提供了顯示單行或多行文本的...詳情>>

            2023-11-23 17:16:27
            setchecked函數(shù)詳解

            一、setchecked函數(shù)setchecked函數(shù)是一個(gè)Vue框架的方法,它用于設(shè)置Tree組件節(jié)點(diǎn)選中狀態(tài)。該函數(shù)接收兩個(gè)參數(shù),分別為node和checked,其中node...詳情>>

            2023-11-23 17:12:51
            @apiresponse詳解

            @apiresponse是Swagger/OpenAPI中的一個(gè)重要的注解,在文檔生成、接口測(cè)試和接口調(diào)試中都有著重要的作用。本文將從多個(gè)方面對(duì)@apiresponse進(jìn)行...詳情>>

            2023-11-23 17:09:15
            linux如何讀取固態(tài)讀寫(xiě)量,linux 讀取硬盤(pán)

            如何監(jiān)測(cè)Linux進(jìn)程的實(shí)時(shí)IO讀寫(xiě)情況Linux下測(cè)試磁盤(pán)的讀寫(xiě)IO速度,使用hdparm命令,下面是測(cè)試方法:io測(cè)試是什么意思?指對(duì)設(shè)備的輸入和輸出...詳情>>

            2023-11-23 16:58:51
            libffi-devel詳解

            一、介紹libffi是一個(gè)C語(yǔ)言庫(kù),它提供了一些接口函數(shù),使得在C語(yǔ)言中調(diào)用其他語(yǔ)言的代碼成為可能。要實(shí)現(xiàn)這一功能,libffi主要提供了以下幾個(gè)接...詳情>>

            2023-11-23 16:40:27