Scala 函数高级操作

1. 字符串高级操作

/**
 * Author: 3zZ.
 * Date: 2020/1/10 6:59 下午
 */
object StringApp extends App{
  val s = "Hello:"
  val name = "3z"
  println(s"Hello:${name}") // 插值表达式
  val b =
    """
      |这是一个多行字符串
      |hello
      |world
      |""".stripMargin
  println(b)
}
// 输出
Hello:3z

这是一个多行字符串
hello
world

2. 匿名函数

/**
 * Author: 3zZ.
 * Date: 2020/1/2 10:30 下午
 * 匿名函数:函数是可以命名的,也可以不命名
 * (参数名:参数类型...) => 函数体
 */
object FunctionApp extends App {
  val m1 = (x:Int) => x+1
  println(m1(10)) // 11
  def add = (x:Int, y:Int) => {x+y}
  println(add(1,2)) // 3
}

3. Curry函数

/**
 * Author: 3zZ.
 * Date: 2020/1/2 10:30 下午
 */
object FunctionApp extends App {
  def sum(a:Int, b:Int) = a+b
  println(sum(1,2))
  // 将原来接收两个参数的一个函数,转换成2个
  def sum2(a:Int)(b:Int) = a + b
  println(sum(1,2))
}

4. 高阶函数

  1. map
  2. filter
  3. flatmap
  4. foreach
  5. reduce
/**
 * Author: 3zZ.
 * Date: 2020/1/2 10:30 下午
 */
object FunctionApp extends App {
  val l = List(1,2,3,4,5,6,7,8)
  // map: 逐个去操作集合中的每个元素
  l.map((x:Int) => x+1)
  l.map(x => x - 1) // 如果只有一个参数 括号可以省略
  l.map(_*2).filter(_ > 8).foreach(println)// 每一个元素 * 2
  l.take(4) // 取前4个
  l.reduce(_+_) // 1 + 2 = 3 + 3 = 6 + 4 = 10...
  l.reduceLeft(_-_) // ((((1-2)-3)-4)-5)
  l.reduceRight(_-_) // (1-(2-(3-(4-5))))
  l.fold(0)(_-_)
  l.foldLeft(0)(_-_)
  l.foldRight(0)(_-_)
  val f = List(List(1,2),List(3,4),List(5,6))
  f.flatten // List(1, 2, 3, 4, 5, 6)
  f.map(_.map(_*2)) // List(List(2,4),List(6,8),List(10,12))
  f.flatMap(_.map(_*2)) // List(2, 4, 6, 8, 10, 12) == flatten + map
}

  • 一个简单wordcount的案例

    val txt = scala.io.Source.fromFile("wordcount.txt").mkString
    val txts = List(txt)
    txts.flatMap(_.split(",")).map(x => (x,1)).groupBy(_._1).mapValues(_.size)
    // scala.collection.immutable.Map[String,Int] = Map(world -> 1, hello -> 2)
    

5. 偏函数

  • 偏函数的定义:被包在花括号类内没有match的一组case语句
package com.zth.fun

import scala.util.Random

/**
 * Author: 3zZ.
 * Date: 2020/1/10 10:49 下午
 * 偏函数:被包在花括号类内没有match的一组case语句
 */
object PartitalFunctionApp extends App {
  // 普通match函数
  val names = Array("a", "b", "c")
  val name = names(Random.nextInt(names.length))
  name match {
    case "a" => println("1")
    case "b" => println("2")
    case _ => println("others")
  }
  // 偏函数
  // A: 输入参数类型 B: 输出参数类型
  def sayChinese:PartialFunction[String, String] = {
    case "a" => "1"
    case "b" => "2"
    case _ => "others"
  }
  println(sayChinese("a"))
}