scala学习笔记08_集合操作

这篇博客详细介绍了Scala中的集合操作,包括过滤(Filter)、映射(Map)、扁平化(FlatMap)、折叠(Fold)等。同时,讲解了高阶函数的使用,如参数为函数的多步骤运算。此外,还探讨了前缀、中缀和后缀操作符,以及Stream的懒加载特性。并展示了如何通过并行化(Parallel)和Zip合并提升代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scala学习笔记08_集合操作

1. 前置操作符、中置操作符、后置操作符

object ExpressDemo {
  def main(args: Array[String]): Unit = {
    val n1 = 1
    val n2 = 2
    val r1 = n1 - n2   //中置操作符相当于操作符是方法名,可以直接省略点调用
    val r2 = n1.-(n2) //看Int的源码即可说明
    println("r1=" + r1 + " r2=" + r2)


    val op = new Opreate
    println(op+++)//后置操作符
    !op//前置操作符
  }

2. 高级函数

/**
 * 高阶函数,参数为函数,一般情况下用于多步骤运算
 * 跟数学中二阶极限类似
 */
object HigherOrderFunction {

  def main(args: Array[String]): Unit = {

    val finalResult = step2(step1, 5)
    println(finalResult)
  }

  def step1(originalParam:Int):Int = {
    println("compute step1")
    originalParam*originalParam

  }

  def step2(f: Int => Int, originalParam: Int): Int ={
    println("compute step2")
    val step1Result = step1(originalParam)
    step1Result*step1Result

  }
}

3. 集合操作

3.1 过滤函数 Filer

/**
 * 过滤函数
 */
object FilerDemo {

  def main(args: Array[String]): Unit = {

    val score = List(33, 44, 55, 66, 99, 100)
    val passedScore = score.filter(isPassed)
    println(passedScore)
  }

  def isPassed(score:Int):Boolean={
    score>60
  }
}

3.2 Map函数

/**
 * final def map[B](f: (A) ⇒ B): List[B]
Permalink
[use case]
Builds a new collection by applying a function to all elements of this list.

B:the element type of the returned collection.

f:the function to apply to each element.

returns:a new list resulting from applying the given function f to each element of this list and collecting the results.

 将list的int元素补零后存到新的list
 */
object MapDemo {
  def main(args: Array[String]): Unit = {

    val ints = List(2, 4, 666)

    val strings = ints.map(f1)
    println(strings)


  }
//左边补零
  def f1(int:Int): String ={
     f"$int%3d".replaceAll(" ", "0")
  }

}

3.3 FlatMap

/**
 * def
flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): Map[B]
[use case] Builds a new collection by applying a function to all elements of this map and using the elements of the resulting collections.
 */
object FlatMapDemo {

  def main(args: Array[String]): Unit = {
    val ints = List("abc")
    val chars = ints.flatMap(f2);
    println(chars)


  }

  def f2(orginalChar:String):String = {
    orginalChar.toUpperCase
   }

}

  1. 4 Fold
/**
 * reduce()——规约操作,包含reduceLeft()和reduceRight()两种操作。

fold()——折叠操作,包含foldLeft()和foldRight()两种操作。

两者功能相似,不同之处在于:

fold()操作需要从一个初始值开始,并以该值作为上下文,处理集合中的每个元素。
————————————————
版权声明:本文为优快云博主「不想当小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_38813668/article/details/89738550
 */
object FoldDemo {
  def main(args: Array[String]): Unit = {
    val ints = List(1, 2, 3);

    println(ints.fold(111)(_-_))

    println(ints.fold(6)(sumF));


    /**
     * foldLeft和foldRight 缩写方法分别是:/:和:\
     */

    var sumVar = (100 /:ints)(sumF)
    println(sumVar)
  }

  def sumF( num1 : Int, num2 : Int ): Int = {
    println("num1 "+num1)
    println("num2 "+num2)
    num1 + num2
  }
}
  1. 5 iterator 迭代器
/**
 * 迭代器,与java类似
 */
object IteratorDemo {
  def main(args: Array[String]): Unit = {
    val ints = List(1, 2, 3)
    val iterator = ints.iterator
    while(iterator.hasNext){
      val item = iterator.next()
      println(item)
    }
    println(iterator.hasNext)//已经迭代过了,需要重新获取一个
    val iterator1 = ints.iterator
    for(item<-iterator1){
      println(item)
    }
  }

}
  1. 6 Reduce
object ReduceDemo {
  def main(args: Array[String]): Unit = {

    //reduceLeft与reduceRight结果相同
    val words = List("I","love","you");
    val sentence = words.reduceLeft(appendF); 0
    println(sentence)

    val sentence2 = words.reduceRight(appendF);
    println(sentence2)

    //reduceLeft与reduceRight结果不同
    val ints = List(101, 202, 3, 666);
    println(ints.reduceLeft(subtraction));
    println(ints.reduceRight(subtraction));
  }
  def appendF(word:String,word2:String):String = {
    word+" "+word2
  }

  def subtraction(number1:Int,number2:Int):Int={
        number1-number2
  }
}
  1. 7 Scan
object ScanDemo {
  /**
   * 扫描,即对某个集合的所有元素做fold操作,但是会把产生的所有中间结果放置于一个集合中保存
   * @param args
   */
  def main(args: Array[String]): Unit = {
    val ints = List(2, 4, 666)
    val resultInts = ints.scan(5)(sumFunction)
    println(resultInts)  //List(5, 7, 11, 677)
  }

  def sumFunction(num1:Int,num2:Int): Int ={
    num1+num2

  }
}
  1. 8 Parallel 并行化
/**
 * 并行化
 */
object ParallelDemo {
  def main(args: Array[String]): Unit = {
   (1 to 5).foreach(showItemAndThread(_))   //main
    (1 to 5).par.foreach(
      showItemAndThread(_)   //ForkJoinPool

    )

   }

  def showItemAndThread(i:Int):Unit={
    println(i)
    println(Thread.currentThread.getName)
  }
}
  1. 9 Zip 合并
/**
 * 将两个list 合并为一个元组
 */
object ZipDemo {
  def main(args: Array[String]): Unit = {
    val code = List("010", "021", "020")
    val citys = List("beijing", "shanghai", "guangzhou")
    val tuples = code.zip(citys)
    println(tuples)
  }
}

4. Stream

4.1 创建

/**
 * 流是一个惰性列表。它仅在需要时评估元素。这是scala的功能。 Scala支持延迟计算。它可以提高程序的性能。
 *
 *  #::   Construct a stream consisting of a given first element followed by elements
 *  from a lazily evaluated Stream.
 */
object MainObject{
  def main(args:Array[String]){
    var stream = 100 #:: 200 #:: 85 #:: Stream.empty
    println(stream)
    var stream2 = (1 to 10).toStream
    println(stream2)
    var firstElement = stream2.head
    println(firstElement)
    println(stream2.take(10))
    println(stream.map{_*2})
  }
}

4.2 关于tail

object StreamTail {
  def main(args: Array[String]): Unit = {
    //创建Stream
    def numsForm(n: BigInt) : Stream[BigInt] = n #:: numsForm(n + 1)  //死递归,但是Stream是懒加载
    val stream1 = numsForm(1)
    println(stream1) //Stream(1, ?)
    //取出第一个元素
    println("head=" + stream1.head) //1
    println(stream1.tail) //Stream(2, ?)

    println(stream1) //Stream(1, 2, ?)
    println(stream1.tail.tail) //Stream(3, ?)
    println(stream1) //Stream(1, 2, 3, ?)

  }
}

4.3 map

  /*
   * map :
   * Returns the stream resulting from applying the given function `f` to each
   * element of this stream.  This returns a lazy `Stream` such that it does not
   * need to be fully realized.
   */
object StreamDemo3 {
  def main(args: Array[String]): Unit = {
    //创建Stream
    def numsForm(n: BigInt) : Stream[BigInt] = n #:: numsForm(n + 1)


    def multi(x:BigInt) : BigInt = {
      x * x
    }
    var stream3 = numsForm(5)
    stream3.tail
    println(stream3) //Stream(5, 6, ?)
    println(stream3.map(multi)) // Stream(25, ?)
    println(stream3.tail.map(multi)) //Stream(36, ?)

  }
}
  1. 4 view 实现懒加载
object StreamDemo4 {
  def main(args: Array[String]): Unit = {

    val stream = numberToStream(5)
    println(stream)
    val stream2 = stream.map(multi)
    println(stream2)

    val ints = numberToStream(5).map(multi)
    println(ints)

    //Stream的懒加载特性,也可以对其他集合应用view方法来得到类似的效果
    val viewDemo = (1 to 10).view

    println(viewDemo.iterator.next())
    println(viewDemo)

  }

  def numberToStream(n:Int):Stream[Int]={
    n #:: numberToStream(n+1)
  }

  def multi(x:Int) : Int = {
    x * x
  }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值