第十章 Scala 容器基础(九):使用foreach来遍历一个集合

Problem

    如何使用foreach方法来遍历一个集合中的所有元素

Solution

    方法foreach使用函数作为参数。这个函数的定义应该使用一个集合元素作为输入参数,同时不应该有返回值。并且这个函数的输入参数类型必须是集合中的元素类型。当foreach方法运行的时候,它每次把一个元素从集合中取出作为参数传入到函数中,直到所有的元素都遍历完毕。

    下面我们来看一个例子,一个通用的用来打印集合信息的例子:

scala> val x = Vector(1,2,3)
x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

scala> x.foreach((i:Int) => println(i))
1
2
3

    这种一种函数定义的普通写法,但其实Scala可以推断出i的类型为Int,所以没有必要写出i:Int

scala> x.foreach(i => println(i))
1
2
3

    我们还有一种更为简洁的写法,这种方式用到了_这种通配符来替代一个临时变量i:

scala> x.foreach(println _)
1
2
3

     在这种情况下,函数字面量包含一个带单个参数的声明,它可以写成更为简洁的形式:

scala> x.foreach(println)
1
2
3

    对于一个像这样简历的例子,最后这样写法是最常用的

Discussion

    只要你的函数只有一个参数,这个参数的类型是和集合元素类型一致的,并且函数没有任何返回值,那么你就可以调用foreach方法。接下来的例子中,printit方法接受一个char类型的参数,然后对它执行若干操作,同时没有返回值:

scala> def printIt(c:Char){println(c)}
printIt: (c: Char)Unit

scala> "HAL".foreach(printIt)
H
A
L

    如果这个函数你只使用一次,那么就没有必要去声明它,直接使用函数字面量就行了

scala> "HAL".foreach((c:Char) => println(c))
H
A
L

    除了可以用于有序集合外,foreach还可以用于Map类,当使用时函数的入参是一个二元祖(key,value):

scala> val m = Map(1->"a",2->"b",3->"c")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> m.foreach(x => println(x._1 + "->" + x._2))
1->a
2->b
3->c

    通常情况下,使用下面的写法更能表达出程序的含义:

movieRatings.foreach {
    case(movie, rating) => println(s"key: $movie, value: $rating")
}

    

转载于:https://my.oschina.net/nenusoul/blog/656365

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值