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. 高阶函数
map
filter
flatmap
foreach
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"))
}