Scala——集合(下)

83 阅读2分钟

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

常用集合操作

Map

map 对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。

def main(args: Array[String]): Unit = {
    import scala.collection.mutable._
    val numbers=mutable.Seq(1,2,3,4,5,6)
    val result = numbers.map((i: Int) => i * 2)
    result.foreach(println)
  }

或者传入一个函数:

def main(args: Array[String]): Unit = {
    def timesTwo(i: Int): Int = i * 2
    val numbers=mutable.Seq(1,2,3,4,5,6)
    val result = numbers.map(timesTwo)
    result.foreach(println)
}
______________________________________________
输出:
2
4
6
8
10
12

foreach

foreach 很像 map ,但没有返回值。 foreach 仅用于有副作用的函数。

def main(args: Array[String]): Unit = {
  val numbers=mutable.Seq(1,2,3,4,5,6)
  numbers.foreach((i: Int) =>  println(s"当前遍历的数值为$i"))
}
__________________________________________________________
输出:
当前遍历的数值为1
当前遍历的数值为2
当前遍历的数值为3
当前遍历的数值为4
当前遍历的数值为5
当前遍历的数值为6

该函数返回值为Unit类型。

filter

filter 移除任何对传入函数计算结果为 false 的元素。返回一个布尔值的函数通常被称为谓词函数[或判定函数]。

def main(args: Array[String]): Unit = {
    val numbers=mutable.Seq(1,2,3,4,5,6)
    val result_1 = numbers.filter((i: Int) => i % 2 == 0)
    result_1.foreach(println)
    println("_____________或者传入一个方法________________")
    def computed(i: Int): Boolean = i % 3 == 0
    val result_2 = numbers.filter(computed)
    result_2.foreach(println)
  }
————————————————————————————————————————————————————————————————
输出:
2
4
6
_____________或者传入一个方法________________
3
6

zip

zip 将两个列表的内容聚合到一个对偶列表中。

def main(args: Array[String]): Unit = {
    val value = List(1, 2, 3).zip(List"a", "b", "c"))
    value.foreach(deep)
    def deep(value:Any): Unit ={
      println(value)
      println(value.getClass)
    }
    println(s"value = ${value}")
  }
____________________________________________
输出:
(1,a)
class scala.Tuple2
(2,b)
class scala.Tuple2
(3,c)
class scala.Tuple2
value = List((1,a), (2,b), (3,c))

partition

partition 将使用给定的谓词函数分割列表。

def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val result = numbers.partition(_ % 2 == 0)
    println(result)
  }
_____________________________
**输出:(可以看出List被依据的条件分割为2个List)**
(List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))

find

find 返回集合中第一个匹配判断函数的元素。返回的元素被some包裹 也就是Java中的Optional

def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
     println(numbers.find((i: Int) => i >= 5))
     println(numbers.find((i: Int) => i >= 11))
    println("_____________________________________")
    //可以使用getOrElse对Some进行Null的默认值设置
    println(numbers.find((i: Int) => i >= 5).getOrElse(0))
    println(numbers.find((i: Int) => i >= 11).getOrElse(0))
  }
输出:
Some(5)
None
_____________________________________
5
0

drop & dropWhile

drop 将删除前i个元素

def main(args: Array[String]): Unit = {
  val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  val value = numbers.drop(5)
  println(value)
}

dropWhile 将删除元素直到找到第一个匹配谓词函数的元素。例如,如果我们在numbers列表上使用 dropWhile

def main(args: Array[String]): Unit = {
  val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  val result_1 = numbers.dropWhile(_+1<=5)
   **//由于从1开始就不满足条件所以不会有数据删除**
  val result_2 = numbers.dropWhile(_+1>5)
println(result_1)
println(result_2)
}
____________________________________________
输出:
List(5, 6, 7, 8, 9, 10)
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

foldLeft & foldRight

0为初始值(记住numbers是 List[Int] 类型),m作为一个累加器。

foldRight 和 foldLeft 一样,只是运行过程相反。

def main(args: Array[String]): Unit = {
  def logger(m: Int, n: Int,info:String ):Int={
    println(s"$info,m的值$m,n的值$n")
    m + n
  }
  val logger_result1=logger(_:Int,_:Int,"result1")
  val logger_result2=logger(_:Int,_:Int,"result2")
  val numbers = List(1, 2, 3, 4, 5)
  val result_1 = numbers.foldLeft(0)(logger_result1)
  val result_2 = numbers.foldRight(0)( logger_result2)
  println(s"最后得出的值为$result_1")
  println("---------------------------")
  println(s"最后得出的值为$result_2")
}
__________________________________________________
输出:
result1,m的值0,n的值1
result1,m的值1,n的值2
result1,m的值3,n的值3
result1,m的值6,n的值4
result1,m的值10,n的值5
result2,m的值5,n的值0
result2,m的值4,n的值5
result2,m的值3,n的值9
result2,m的值2,n的值12
result2,m的值1,n的值14
最后得出的值为15
---------------------------
最后得出的值为15

flatten

flatten 将嵌套结构扁平化为一个层次的集合。

def main(args: Array[String]): Unit = {
    val flatten = List(List(1, 2), List(3, 4), List(5, 6)).flatten
    println(flatten)
  }
——————————————————————————————————————————————————————————————————
输出:
List(1, 2, 3, 4, 5, 6)

flatMap

flatMap 是一种常用的组合子,结合映射 [mapping] 和扁平化 [flattening] 。 flatMap 需要一个处理嵌套列表的函数,然后将结果串连起来。

def main(args: Array[String]): Unit = {
    val names = List("Alice", "Bon", "Nick")

    //需求是将 List 集合中的所有元素, 进行扁平化的操作, 即把所有的元素打散
    val names2: Any = names.flatMap(upper)
    println(s"names2: ${names2}")

    val list1 = List("hello world", "kino hello", "hello hello hello")
    //val list2: List[List[String]] = list1.map(x => x.split(" ").toList)
    val list2: List[String] = list1.flatMap(x => x.split(" "))
    println(s"list2: ${list2}")
  }

  def upper(s: String): String = {
    s.toUpperCase()
  }
______________________________________________________________
输出:
names2: List(A, L, I, C, E, B, O, N, N, I, C, K)
list2: List(hello, world, kino, hello, hello, hello, hello)