for遍历list scala_第十章 Scala 容器基础(十):使用for循环来遍历一个集合

Problem

我想使用for循环来遍历容器的所有元素,或者通过for yield来创建一个新的集合。

Solution

你可以使用for循环遍历所有的Traversable类型(基本上所有的sequency都可以):

scala> val fruits = Traversable("apple", "banana", "orange")

fruits: Traversable[String] = List(apple, banana, orange)

scala> for (f 

apple

banana

orange

scala> for (f 

APPLE

BANANA

ORANGE

如果你的循环体代码很长,那么你同样可以像正常使用for循环一样,执行多行的代码块:

scala> for (f 

|   val s = f.toUpperCase

|   println(s)

| }

APPLE

BANANA

ORANGE

使用一个计数器当作下标来访问一个集合:

scala> val fruits = IndexedSeq("apple", "banana", "orange")

fruits: IndexedSeq[String] = Vector(apple, banana, orange)

scala> for (i 

element 0 is apple

element 1 is banana

element 2 is orange

你同样可以使用zipWithIndex方法来遍历集合的时候获取当前元素的索引:

scala> for ((elem, count) 

element 0 is apple

element 1 is banana

element 2 is orange

生成一个计数器来获取集合元素下标的另一个方法是zip stream:

scala> for ((elem,count) 

element 1 is apple

element 2 is banana

element 3 is orange

scala> for ((elem,count) 

element 0 is apple

element 1 is banana

element 2 is orange

The for/yield construct

当你想通过一个现有的集合,对其元素进行加工后生成一个新的集合,那么就可以使用for yield这样形式:

scala> val fruits = Array("apple", "banana", "orange")

fruits: Array[String] = Array(apple, banana, orange)

scala> val newArray = for (e 

newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

再看一下这个例子的另外两种形式,一个是当for循环方法体是多行的时候,另一个形式是当你想复用yield后面的操作函数时:

scala> val newArray = for (e 

|   val s = e.toUpperCase

|   s

| }

newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

scala> def upper(s: String):String = {s.toUpperCase}

upper: (s: String)String

scala> val newArray = for (e 

newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

Map

使用for循环来遍历一个Map同样也是非常方便的:

scala> val names = Map("fname" -> "Ed", "lname" -> "Chigliak")

names: scala.collection.immutable.Map[String,String] = Map(fname -> Ed, lname -> Chigliak)

scala> for ((k,v) 

key: fname, value: Ed

key: lname, value: Chigliak

Discussion

When using a for loop, the

for (i 

在使用for循环来遍历一个集合元素的时候,我们同样可以添加if字句来对元素进行过滤:

for {

file 

if file.isFile //file是一个文件

if file.getName.endsWith(".txt") //file后缀名为.txt

} doSomething(file)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值