8.2 使用Set
假定我们要写一个RSS阅读器,想经常去更新一些RSS源,但并不关心顺序。我们可以把RSS源的URL存在一个Set
里。假定在两个Set
里存储了下列RSS源:
val feeds1 = Set("blog.toolshed.com", "pragdave.pragprog.com",
"pragmactic-osxer.blogspot.com", "vita-contemplativa.blogspot.com")
val feeds2 = Set("blog.toolshed.com", "martinfowler.com/bliki")
如果只想更新feeds1
里特定的RSS源,比如属于Blogspot
的,可以用filter()
方法获取这些RSS源:
val blogSpotFeeds = feeds1 filter ( _ contains "blogspot" )
println("blogspot feeds: " + blogSpotFeeds.mkString(", "))
输出如下:
blogspot feeds: pragmactic-osxer.blogspot.com, vita-contemplativa.
blogspot.com
mkString()
为Set
的每个元素创建了其字符串表示,然后,用实参字符串(本例是逗号)将结果连接起来。
如果需要将两个RSS源的Set
合并成一个新的Set
,可以用++()
:
val mergedFeeds = feeds1 ++ feeds2
println("# of merged feeds: " + mergedFeeds.size)
Set
至多持有每个元素一次,从输出里可以看到这一点,在合并后的Set
里,两个Set
里公共的RSS源只存储一次:
# of merged feeds: 5
如果想同朋友交换看法,找出彼此共有的RSS源,我们可以导入朋友的RSS源,执行交集运算(**()
):
val commonFeeds = feeds1 ** feeds2
println("common feeds: " + commonFeeds.mkString(", "))
对上面两组RSS源执行交集运算的效果如下:
common feeds: blog.toolshed.com
如果想在每个RSS源前加上“http://”,可以用map()
方法。这个方法对每个元素应用给定的函数值,将结果收集到一个Set
里,最后将产生的Set
返回。如果想用索引访问Set
的元素,可以用toArray()
方法将元素复制到数组里:
val urls = feeds1 map ( "http://" + _ )
println("One url: " + urls.toArray(0))
我们应该看见下面的结果:
One url: http://blog.toolshed.com
最后,如果准备好对RSS源进行迭代,一次一个的进行刷新,可以用内建的迭代器foreach()
,像这样:
println("Refresh Feeds:")
feeds1 foreach { feed => println(" Refreshing " + feed ) }
结果如下:
Refresh Feeds:
Refreshing blog.toolshed.com
Refreshing pragdave.pragprog.com
Refreshing pragmactic-osxer.blogspot.com
Refreshing vita-contemplativa.blogspot.com