7. Scala字符串和函数的高级操作 匿名函数,curry函数,map,reduce,fold,flatten,flatMap

字符串的高级操作

插值和多行操作

package com.yy.scala

object StringApp extends App{

  //插值 字符串连接
  val a = "world"
  println(s"Hello $a")

  //多行操作 Shift+" 按三次 Enter
  val b =
    """
      |Hello
      |world
      |come on
      |""".stripMargin
  println(b)

}

-------------------------------------

输出样式如下
Hello world

Hello
world
come on

匿名函数

没有名称的函数称为匿名函数
(参数名: 参数类型) => 函数体

package com.yy.scala

object AnonymousFunctionApp extends App {
  //有名称的函数
  def sayHello(name:String): Unit = {
    println("Hello " + name)
  }
  sayHello("world")
  //匿名函数 传给一个变量
  val sum =  (x: Int) => x+1
  println(sum(2))

  //匿名函数 传给一个函数
  def add = (x:Int,y:Int)=>{x+y}
  println(add(1,2))
}

curry函数

curry颗粒化函数
将原来接收多个参数的一个函数,转换成多个

  def sum(x:Int, y:Int) = x + y
  println(sum(2,3))

  def sum2(x:Int)(y:Int) = x + y
  println(sum2(2)(3))

高阶函数

map
reduce(reduceLeft, reduceRight)
fold(flodLeft, foldRight)
flatten、flatMap

//map: 逐个去操作集合中的每个元素 1,2,3 2 1,2,3,4,5 3
  val list = List(1,2,3,4,5)
  list.map((x:Int) => x + 1)
  list.map(x => x * 2)
  list.map(_ * 2)

  //filter: 过滤元素
  list.map(_ * 2).filter(_ > 5)

  //take:取元素的前n个
  list.take(3).foreach(println)


  //reduce,对集合中的元素进行归约操作,不指定left还是right默认是left
  //两两相加 1+2=3 3+3=6 6+4=10 10+5=15
  list.reduce(_+_)

  //从左向右归约
  //1-2=-1 -1-3=-4 -4-4=-8 -8-5=-13
  list.reduceLeft(_-_)

  //从右向左归约
  //4-5=-1 3-(-1)=4 2-4=-2 1-(-2)=3
  list.reduceRight(_-_)

  /**
   * fold,对集合中的元素进行折叠操作,不指定left还是right默认是left
   * fold()操作需要从一个初始值开始,并以该值作为上下文,处理集合中的每个元素
   */
  //第一个参数0为Int类型的初始值,第二个参数为返回类型为Int的函数
  val sumD:Int = list.fold(0)((x,y)=>{
    x+y
  })

  /**
   * 从左向右折叠,以下操作初始值为0,相当于上面的reduceLeft
   *  flodLeft的简写 /:
   */
  val sumL:Int = list.foldLeft(0)((x,y)=>{
    x+y
  })

  val sumL2 = (0/:list)(_+_)

  /**
   * 从右向左折叠,以下操作初始值为0,相当于上面的reduceRight
   * foldRight的简写 :\
   */
  val sumR:Int = list.foldRight(0)((x,y)=>{
    x-y
  })

  val sumR2 = (list:\0)(_-_)


  val flatList = List(List(1,2),List(3,4),List(4,5))
  //flatten,将List[List]类型合并为List[String] 结果为 List(1, 2, 3, 4, 4, 5)
  val fl = flatList.flatten
  //flatMap,将集合打扁后对每个元素操作
  var fm = flatList.map(_.map(_*2))//List(List(2, 4), List(6, 8), List(8, 10))
  var fm2 = flatList.flatMap(_.map(_*2))//List(2, 4, 6, 8, 8, 10)

猜你喜欢

转载自www.cnblogs.com/yanceyy/p/11949454.html