文档章节

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

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/04/10 23:26
字数 686
阅读 464
收藏 0

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 <- fruits) println(f)
apple
banana
orange

scala> for (f <- fruits) println(f.toUpperCase)
APPLE
BANANA
ORANGE

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

scala> for (f <- fruits) {
     |   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 <- 0 until fruits.size) println(s"element $i is ${fruits(i)}")
element 0 is apple
element 1 is banana
element 2 is orange

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

scala> for ((elem, count) <- fruits.zipWithIndex) {println(s"element $count is $elem")}
element 0 is apple
element 1 is banana
element 2 is orange

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

scala> for ((elem,count) <- fruits.zip(Stream from 1)) {println(s"element $count is $elem")}
element 1 is apple
element 2 is banana
element 3 is orange

scala> for ((elem,count) <- fruits.zip(Stream from 0)) {println(s"element $count is $elem")}
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 <- fruits) yield e.toUpperCase
newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

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

scala> val newArray = for (e <- fruits) yield {
     |   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 <- fruits) yield upper(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) <- names) println(s"key: $k, value: $v")
key: fname, value: Ed
key: lname, value: Chigliak

Discussion

    When using a for loop, the <- symbol can be read as “in,” so the following statement can be read as “for i in 1 to 3, do ...”:

for (i <- 1 to 3) { // more code here ...

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

for {
    file <- files
    if file.isFile //file是一个文件
    if file.getName.endsWith(".txt") //file后缀名为.txt
} doSomething(file)


© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
第十章 Scala 容器基础(十二):使用Iterators

Problem 你需要在你的应用中使用iterator。 Solution 尽管使用带有hasNext()和next()方法的iterator是非常通用的遍历Java集合的方法。但是它们在Scala集合中并不经常被使用。因为Java集合有许...

阿拉德大陆的魔法师
2016/04/12
345
0
第十章 Scala 容器基础(二十四):给集合创建一个懒加载视图

Problem 你正在使用一个巨大的集合,并且想创建一个懒加载的版本。只有在计算或者返回结果时才真正被调用。 Solution 除了Stream类,不论什么时候你创建一个Scala集合类的实例,你都创建了一...

阿拉德大陆的魔法师
2016/04/18
138
0
第十章 Scala 容器(一):整体介绍

整体架构 Scala容器类是非常丰富的,整体架构也比较复杂,下面我们来根据图(10-2)来认识一下。Scala的容器类都是从Traversable和Iterable这两个trait开始的,然后分为三大类,分别是Seq,Set...

阿拉德大陆的魔法师
2016/04/01
355
1
第十章 Scala 容器基础(七):用Vector作为你指定的不可变序列

问题: 你需要为你的Scala应用选择一个快速,通用的不可变序列集合类型,那么该如何选择呢? 解决: Vecotr类目前可以被认为是这么一个通用的不可变数据结构。Vector是一个带索引的不可变序列...

阿拉德大陆的魔法师
2016/04/10
1K
0
第十章 Scala 容器基础(二十七):元组

Problem 你想要创建一个集合,集合元素类型是多样的。 Solution 元组为你提供了一种方式来存储不同类型的元素在一个容器内,这在许多情况下是非常有用的。 新建一个元祖通过把需要的额元组包...

阿拉德大陆的魔法师
2016/04/19
105
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部