如果不了解map
,flatMap
,zip
和reduce
函数,你就不能真正地谈论scala
。通过这些函数,我们可以非常容易地处理列表的内容并结合Option
对象工作。你可以在这个站点找到更多的片段:
Scala片段 1:Folding
Scala 片段2:List的操作符魔法
让我们从map
开始,通过map
我们可以将一个函数应用于列表的每一个元素并且将其作为一个新的列表返回。
我们可以这样对列表的元素进行平方:
scala> list1
res3: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> list1.map(x=>x*x)
res4: List[Int] = List(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
一些函数可能返回Option
元素。例如:
scala> val evenify = (x:Int) => if (x % 2 == 0) Some(x) else None
evenify: Int => Option[Int] = <function1>
scala> list1.map(evenify)
res6: List[Option[Int]] = List(Some(0), None, Some(2), None, Some(4), None, Some(6), None, Some(8), None, Some(10))
这个例子的问题是我们常常并不关心None
。但我们怎么轻松地把他排除出去呢?对于此我们可以使用flatMap
。通过flatMap
我们可以处理元素是序列的列表。将提供的函数应用于每个序列元素会返回包含原始列表所有序列内的元素的列表。通过以下的例子会更好理解:
scala> val list3 = 10 to 20 toList
list3: List[Int] = List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
scala> val list2 = 1 to 10 toList
list2: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> val list4 = List(list2, list3)
list4: List[List[Int]] = List(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20))
scala> list4.flatMap(x=>x.map(y=>y*2))
res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18