Scala的高级用法

简介: Scala的高级用法

文章目录

1. 默认参数值

1.1 方法默认参数

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

   //定义打印日志方法

   def log(date:Date,msg:String,level:String="Info"): Unit ={

     println(s"$date  $level $msg")

   }

   log(new Date,"你好");

   log(new Date(),"你好","Info");

   log(new Date(),"错误信息","Error");

 }

默认值顺序在中间的调用加上命名参数才能调用,否则报错

def log(date:Date,level:String="Info",msg:String): Unit ={

     println(s"$date  $level $msg")

   }

   log(new Date,msg="你好");

1.2 类默认参数

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

   val point1 = new Point(y = 1)

   point1.printLocation()

 }

 class Point(val x: Double = 0, val y: Double = 0){

   def printLocation(): Unit ={

     print(s"x=$x  $y")

   }

 }

2. 特质 (Traits)

用于在类 (Class)之间共享程序接口 (Interface)和字段 (Fields)。 它们类似于Java 8的接口。 类和对象 (Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。

2.1 子类型

trait Animal {

 def say(): Unit ={

   println("animal say....")

 }

 def walk(): Unit ={

   println("animal walk....")

 }

}

//cat 继承animal

class Cat extends Animal{

 def miaomiao(): Unit ={

   println("car miaomiao...")

 }

}

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

 val cat=new Cat()

 cat.miaomiao()

 cat.walk()

 cat.say()

}

// car miaomiao...

//animal walk....

//animal say....

2.2 扩展特征,当做接口来使用

//定义迭代器 使用泛型T

 trait Iterator[T] {

   def hasNext: Boolean

   def next(): T

 }

 //自定义实现的Int类型的迭代器

 class IntIterator(to: Int) extends Iterator[Int] {

   private var current = 0

   override def hasNext: Boolean = current < to

   override def next(): Int =  {

     if (hasNext) {

       val t = current

       current += 1

       t

     } else 0

   }

 }

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

   val intIterator = new IntIterator(5)

   while(intIterator.hasNext){

     println(intIterator.next())

   }

//    0

//    1

//    2

//    3

//    4

3.元组

元组是一个可以包含不同类型元素的类,元组是不可变的。

经常用于函数返回多个值。

元组包含2-22给个元素之间。

3.1 定义与取值

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

   val t1 = Tuple1(1)

   //访问元素

   println(t1._1)

   val t2 = new Tuple1("asdas")

   println(t2._1)

   //也可以直接括号

   val t3=("as",12,false)

   //指定类型

   val t4=("as",12,true,0.88):Tuple4[String,Int,Boolean,Double]

 }

3.2 元组用于模式匹配

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

   val courseScores = List(("Chinese", 77), ("Math", 100), ("Geo", 0 ),("English", 55 ))

   //遍历

   courseScores.foreach{ tuple => {

      tuple match {

        case p if(p._2 == 100) => println(s" ${p._1} score is 100")

        case p if(p._2 > 60 ) => println(s" ${p._1} score is greater than 60")

        case p if(p._2 == 0) => println(s" ${p._1} score is o")

        case _ => println(s"不及格")

     }

   }

   }

3.3 用于for循环

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

   val numPairs = List((2, 5), (3, -7), (20, 56))

   for ((a, b) <- numPairs) {

     println(a * b)

   }

   ///10

   //-21

   //1120

 }

4 高阶函数

使用函数来作为参数或则返回结果。

4.1 常见的高阶函数map

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

   var seqno = Seq(1,2,3)

   val values = seqno.map(x => x * x)

   for ( x <- values ){

     println(x )

   }

//    1

//    4

//    9

 }

4.2 简化涨薪策略代码

//定义加薪的规则

 def smallPromotion(salaries: List[Double]): List[Double] =

   salaries.map(salary => salary * 1.2)

 //薪资的

 def greatPromotion(salaries: List[Double]): List[Double] =

   salaries.map(salary => salary * math.log(salary))

 //薪资

 def hugePromotion(salaries: List[Double]): List[Double] =

   salaries.map(salary => salary * salary)

 }

去掉重复代码,定义一个方法接口,涨薪的规则传入函数

 def promotion(salaries: List[Double], promotionFunction: Double => Double): List[Double] = {

   salaries.map(promotionFunction)

 }

测试

val salaries = List(2500.00,3000.00,4000.00)

 //实现涨薪

 var newsalaries= promotion(salaries,(x:Double) => x* 1.2)

 for(s <- newsalaries){

   print(s"$s ")

   //3000.0 3600.0 4800.0

 }

 println()

 println("-----------------------------")

 println()

 var newsalaries2= promotion(salaries,(x:Double) => x* x)

 for(s <- newsalaries2){

   print(s"$s ")

   //6250000.0 9000000.0 1.6E7  

 }

 

5.嵌套方法

嵌套方法经常使用的就是递归调用。

求阶乘

//定义阶乘

   def fac(x:Int):Int = {

     if (x==1) {

       x

     }

     else {

       x * fac(x-1)

     }

   }

   //24

   print(fac(4))

6.多参数列表(柯里化

方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化

def foldLeft[B](z: B)(op: (B, A) => B): B = {

   var acc = z

   var these: LinearSeq[A] = coll

   while (!these.isEmpty) {

     acc = op(acc, these.head)

     these = these.tail

   }

   acc

 }

测试

val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

   val res = numbers.foldLeft(0)((m, n) => m + n)

   print(res) // 55

7.模式匹配

7.1 简单的模式匹配

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

   val x: Int = Random.nextInt(5)

  val str = x match {

     case 0 => "zero"

     case 1 => "one"

     case 2 => "two"

     case _ => "other"

   }

   println(str)

 }

8.隐式转换

方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。

8.1 官网的列子

//定义一个抽象类,提供两个方法一个add 一个unit

   abstract class Monoid[A] {

     def add(x: A, y: A): A

     def unit: A

   }

    //隐式实现字符串的拼接

     implicit val stringMonoid: Monoid[String] = new Monoid[String] {

       def add(x: String, y: String): String = x concat y

       def unit: String = ""

     }

     //隐式实现整型的数字相加

     implicit val intMonoid: Monoid[Int] = new Monoid[Int] {

       def add(x: Int, y: Int): Int = x + y

       def unit: Int = 0

     }

     //传入一个list实现不同类型的累加

     def sum[A](xs: List[A])(

       implicit m: Monoid[A]): A =

       if (xs.isEmpty) m.unit

       else m.add(xs.head, sum(xs.tail))

     println(sum(List(1, 2, 3)))       // 6

     println(sum(List("a", "b", "c"))) //abc

完结,其他的可以到官网看看,用到在学。

相关文章
|
7月前
|
消息中间件 分布式计算 Java
Scala函数式编程【从基础到高级】
Scala函数式编程【从基础到高级】
|
7月前
|
存储 Scala 索引
scala中常见数据结构的用法
scala中常见数据结构的用法
55 1
|
7月前
|
SQL 分布式计算 Serverless
scala-spark中的groupby、like等的用法
scala-spark中的groupby、like等的用法
262 0
|
前端开发 Java 程序员
Scala高级用法 3
Scala高级用法
52 0
|
Java Scala
Scala高级用法 2
Scala高级用法
51 0
|
分布式计算 Java Scala
Scala高级用法 1
Scala高级用法
62 0
|
Java Scala
scala 匿名函数的用法实操
1. => 什么意思 => 匿名函数(Anonymous Functions),表示创建一个函数实例。 比如:(x: Int) => x + 1 和如下JAVA方法表示的含义一样:
129 0
scala之list用法史上最全
Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是 下面是list的常用方法,当然了这不是所有的.但都是最常用的.具体看下面的demo.具体可以看代码里面的注释
|
2月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
77 5
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
56 3