8.2 使用Set

假定我们要写一个RSS阅读器,想经常去更新一些RSS源,但并不关心顺序。我们可以把RSS源的URL存在一个Set里。假定在两个Set里存储了下列RSS源:

  1. val feeds1 = Set("blog.toolshed.com", "pragdave.pragprog.com",
  2. "pragmactic-osxer.blogspot.com", "vita-contemplativa.blogspot.com")
  3. val feeds2 = Set("blog.toolshed.com", "martinfowler.com/bliki")

如果只想更新feeds1里特定的RSS源,比如属于Blogspot的,可以用filter()方法获取这些RSS源:

  1. val blogSpotFeeds = feeds1 filter ( _ contains "blogspot" )
  2. println("blogspot feeds: " + blogSpotFeeds.mkString(", "))

输出如下:

  1. blogspot feeds: pragmactic-osxer.blogspot.com, vita-contemplativa.
  2. blogspot.com

mkString()Set的每个元素创建了其字符串表示,然后,用实参字符串(本例是逗号)将结果连接起来。

如果需要将两个RSS源的Set合并成一个新的Set,可以用++()

  1. val mergedFeeds = feeds1 ++ feeds2
  2. println("# of merged feeds: " + mergedFeeds.size)

Set至多持有每个元素一次,从输出里可以看到这一点,在合并后的Set里,两个Set里公共的RSS源只存储一次:

  1. # of merged feeds: 5

如果想同朋友交换看法,找出彼此共有的RSS源,我们可以导入朋友的RSS源,执行交集运算(**()):

  1. val commonFeeds = feeds1 ** feeds2
  2. println("common feeds: " + commonFeeds.mkString(", "))

对上面两组RSS源执行交集运算的效果如下:

  1. common feeds: blog.toolshed.com

如果想在每个RSS源前加上“http://”,可以用map()方法。这个方法对每个元素应用给定的函数值,将结果收集到一个Set里,最后将产生的Set返回。如果想用索引访问Set的元素,可以用toArray()方法将元素复制到数组里:

  1. val urls = feeds1 map ( "http://" + _ )
  2. println("One url: " + urls.toArray(0))

我们应该看见下面的结果:

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

最后,如果准备好对RSS源进行迭代,一次一个的进行刷新,可以用内建的迭代器foreach(),像这样:

  1. println("Refresh Feeds:")
  2. feeds1 foreach { feed => println(" Refreshing " + feed ) }

结果如下:

  1. Refresh Feeds:
  2. Refreshing blog.toolshed.com
  3. Refreshing pragdave.pragprog.com
  4. Refreshing pragmactic-osxer.blogspot.com
  5. Refreshing vita-contemplativa.blogspot.com