Scala 集合Set使用方法

2019-05-12 19:23:41 | 编辑 | 添加

Set是不能存储相同元素集合,而且是无序的

1 Set定义初始化

val feeds1 = Set("blog.toolshed.com", "pragdave.me", "blog.agiledeveloper.com")
val feeds2 = Set("blog.toolshed.com", "martinfowler.com/bliki")


2 Set过滤filter和转换成字符串mkString

如果我们只是想更新从 feeds1 中选择的feed,如所有包含有“blog”这个词的,那么我们可以使用filter()方法来获取这些feed。

val blogFeeds = feeds1 filter (_ contains "blog")
println(s"blog feeds: ${blogFeeds.mkString(", ")}")

我们将会得到如下输出:

blog feeds: blog.toolshed.com, blog.agiledeveloper.com

mkString()方法为Set 中的每一个元素都创建了一个对应的字符串表示形式,并将结果与参数字符串(在这个例子中的逗号)拼接起来。


3 Set集合合并

如果要合并两个 Set 的feed 来创建一个新的Set,那么我们可以使用++()方法:

val mergedFeeds = feeds1 ++ feeds2
println(s"# of merged feeds: ${mergedFeeds.size}")

同一个元素将最多只会被Set 存储一次:

# of merged feeds: 4


4 Set集合求交集 &方法

如果要确定我们和某个朋友所订阅的多个 feed 中相同的部分,那么我们可以导入朋友的feed,并执行求交集操作(即调用&()方法):

val commonFeeds = feeds1 & feeds2
println(s"common feeds: ${commonFeeds.mkString(", ")}")

下面是在前面提到的两个 feed Set 上执行求交集操作之后的结果:

common feeds: blog.toolshed.com


5 Set集合遍历操作map,foreach

如果要在每个 feed 的前面加上一个“http://”字符串前缀,我们可以使用map()方法。这将对每个元素应用给定的函数值、将结果收集到一个Set 中,并最终返回这个Set:

val urls = feeds1 map ("http://" + _)
println(s"One url: ${urls.head}")

我们将会看到下面的结果:

One url: http://blog.toolshed.com


最后,当我们准备好循环遍历这些feed 并一个一个地刷新它们的时候,我们可以使用内置的迭代器foreach()方法,如下所示:

println("Refresh Feeds:")
feeds1 foreach { feed => println(s" Refreshing $feed...") }

下面是输出结果:

Refresh Feeds:
Refreshing blog.toolshed.com...
Refreshing pragdave.me...
Refreshing blog.agiledeveloper.com...