18 Scala常用集合操作

1 map映射操作

map 映射可以将集合内的每一个元素通过指定的功能(函数) 映射转化成新的集合
# 将 list1内的每一个元素加 1 操作 ,也可以传入一个函数
scala> val list1=List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)

scala> val list2 = list1.map(x=>x+1)
list2: List[Int] = List(2, 3, 4, 5)

scala> list2
res0: List[Int] = List(2, 3, 4, 5)

2 filter 过滤操作

filter 过滤是将符合条件的元素过滤到新的集合中

# filter 过滤
scala> val list3 = List(10,20,30)
list3: List[Int] = List(10, 20, 30)

scala> val list4 =list3.filter(x=>x>=20)
list4: List[Int] = List(20, 30)

scala> list4
res1: List[Int] = List(20, 30)

3 reduceLeft 化简

reduceLeft 与 reduceRight

    val list = List(1, 2, 3, 4, 5)
 	list3.reduceLeft(_ + _)  // 数组求和  ( ( ( (1+2)+3)+4)+5)
 	list3.reduceLeft(_ * _)  // 数组求乘积
 	list3.reduceLeft(_ min _) // 数组求最小直值
    list3.reduceLeft(_ max _) // 数组求最大值
    list.reduceRight(minus) // 从右边开始运算  1 - (2 - (3 -(4 - 5))) = 3
    
    list.reduceLeft(min)  // 使用自定义函数
    // 自定义函数 求最小值
  def min(n1: Int, n2: Int): Int = {
    if (n1 > n2) n2 else n1
  }
  

4 foldLeft 折叠

reduceLeft是 foldLeft的简化版,foldLeft使用时需要传入一个初始值
foldLeft 与 foldRight

scala> val list = List(1, 2, 3, 4, 5)
list: List[Int] = List(1, 2, 3, 4, 5)

scala> list.foldLeft(5)(_-_)  // 可以理解为 List(5,1, 2, 3, 4, 5)
res9: Int = -10 // 执行步骤: ((((5-1)-2)-3)-4)-5
scala> list.foldRight(5)(_-_) // 右折叠 1-(2-(3-(4-(5-5))))
res10: Int = -2
 
 scala> (5 /: list)(_-_)  // 左折叠可以这样简写 
res13: Int = -10

scala> (list :\ 5)(_-_)  // 右折叠 可以这样简写 
res14: Int = -2

5 scan 扫描

scan扫描会把所有的元素做fold操作,但是会把产生的所有中间结果放置于一个集合中保存

scala> val list = List(1, 2, 3, 4, 5)  
scala> var list2 = list.scanLeft(5)(_+_)
list2: List[Int] = List(5, 6, 8, 11, 15, 20)  // 可以观察到其实是把 foldLeft的每一步操作结果保存到集合中

6 zip 拉链

zip 就是对两个集合进行对偶元组合并,可以使用拉链,需要取值时 ,需要遍历,要求两个集合长度相同

scala>  val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)

scala> val list2 = List(4, 5, 6)
list2: List[Int] = List(4, 5, 6)

scala> list.zip(list2)
res15: List[(Int, Int)] = List((1,4), (2,5), (3,6))

zipAll 用法,可以对两个相同或不同的结合进行操作,需要传入两个默认值,当集合长度不同时需要用到

scala> val list = List(1,2,3)
list: List[Int] = List(1, 2, 3)

scala> val list1 = List(4,5,6,7)
list1: List[Int] = List(4, 5, 6, 7)

scala> list.zipAll(list1,8,9)  
res1: List[(Int, Int)] = List((1,4), (2,5), (3,6), (8,7))

7 迭代器

/* 源码
 
     def iterator: Iterator[A] = new AbstractIterator[A] {
    var these = self
    def hasNext: Boolean = !these.isEmpty
    def next(): A =
      if (hasNext) {
        val result = these.head; these = these.tail; result
      } else Iterator.empty.next()
     */

使用
遍历迭代器取值

val iterator = List(1, 2, 3, 4, 5).iterator
方法一:
while (iterator.hasNext) {
  println(iterator.next())
}
方法二
for(enum <- iterator) {
  println(enum) 
}

Guess you like

Origin blog.csdn.net/u014644167/article/details/113099477