麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

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

千鋒教育

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

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

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

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

List.foreach詳解

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

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

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

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

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

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


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

list.foreach(e => println(e))的意思是對list中的每個元素e執(zhí)行println(e)操作。而for循環(huán)則要寫成for(e <- list) println(e)??雌饋?,List.foreach要比for循環(huán)更加簡潔明了。

三、List.foreach和Stream.foreach

Scala標(biāo)準(zhǔn)庫中,只有Stream使用了類似于惰性求值的技術(shù),其他的集合都是嚴(yán)格求值,但是在不同情境下,Stream的惰性求值有時可能會造成一定的影響。舉個例子,讓我們來看一下對一個List和一個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)

上述代碼會輸出列表中的十個數(shù)和Stream中的無限序列,這種情況下使用List和Stream的foreach方法沒有什么區(qū)別。但是,讓我們考慮對這兩種數(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))

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

四、List.foreach中的break

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


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)
  }
}

這段代碼會輸出1至5的整數(shù)。breakable方法會將其內(nèi)部的代碼塊作為一個整體,在內(nèi)部執(zhí)行break方法時,將拋出一個BreakControl異常,從而中斷循環(huán)。然而,這種做法的可讀性和健康性都值得商榷,因為它的行為偏向于不穩(wěn)定和難以維護(hù)。

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

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


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時,會跳出循環(huán)而直接返回上層函數(shù)。然而在使用return語句時,必須將其放在foreach方法的代碼塊中,在Scala中即便在lambda式中使用return也會直接報錯。

六、List.foreach移除對象

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


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中,遍歷這個ListBuffer,如果其中的一個數(shù)是偶數(shù),則將其從ListBuffer中移除。最終將剩余的數(shù)字輸出。 ListBuffer支持移除元素的操作,這樣遍歷時就可以方便的實現(xiàn)對元素的移除操作。

七、List.foreach詳解

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


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

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


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

那么我們就可以通過方法名的方式來引用它,并在foreach方法中使用


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

八、List.foreach能用break中斷嗎

前文提到,List.foreach方法并不支持break的使用。但我們也可以借助Scala中的一些函數(shù)式方法來將foreach轉(zhuǎn)為其他形式的方法。例如可以使用takeWhile來實現(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方法的作用是保留滿足條件的元素,一旦遇到不滿足條件的元素就結(jié)束整個遍歷。我們可以將截止策略存放在takeWhile方法的lambda表達(dá)式中,然后在該表達(dá)式中通過if-else控制何時退出遍歷。這種方式可以避免throw異常的情況,同時代碼也更為優(yōu)美易讀。

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

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


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

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


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

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

tags: listforeach
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(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
主站蜘蛛池模板: 国产护士一级毛片高清| 啊公交车坐最后一排被c视频 | 顶级欧美色妇xxxxx| 国产v亚洲v欧美v专区| 日本漫画之无翼彩漫大全| 四库影院永久在线精品| 国产福利精品一区二区| 美女扒开尿口给男人桶爽视频| 东北女人下面痒大叫| 国产欧美精品一区二区色综合 | 久久精品国产色蜜蜜麻豆| 欧美激情xxxx性bbbb| 大胸校花被老头粗暴在线观看| 再去温泉吧| 日韩毛片高清在线看| 男女性潮高清免费网站| 麻豆亚洲| 又爽又刺激的视频| 国产一级三级三级在线视| 坛蜜甜蜜皮鞭| 亚洲成a人片在线观看www| 小sao货水好多真紧h视频| 亚洲欧美精品日韩欧美| 精品一区二区三区在线观看| 精品伊人久久大线蕉色首页| caopon在线| 亚洲国产欧美日韩精品一区二区三区| 在线看福利影| 日本巨黄视频| 午夜精品久久久久久| 免费一级毛片在线播放不收费| 大学寝室沈樵无删减| 人人爽天天碰天天躁夜夜躁| 久久一区二区明星换脸 | 你懂的在线看| 久久香蕉国产| 激情交叉点2| 中文在线√天堂| 青草国产在线| 福利视频一二区| 天天想你在线视频免费观看|