大数据知识:快学Scala(二)模式匹配和样例类以及高级性质

时间:2022-09-02 06:27:56

简介

    Scala中最大的强大的机制是模式匹配的机制。可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配

字符串的匹配

package cn.edu.hust.cases

import scala.util.Random


object StringDemo{
  def main(args: Array[String]): Unit = {
    //println("hello,scala")
    val list = List("hello", "Scala", "java")
    val s = list(Random.nextInt(3))
    s match {
      case "hello" => println("hello,world")
      case "java" => println("java")
      case _ => println("others")
    }
    println("hello")
  }
}

类型匹配

package cn.edu.hust.cases

import scala.util.Random

object TypeDemo {
  def main(args: Array[String]): Unit = {
    val list=List(1,"abc",TypeDemo)
    val s=list(Random.nextInt(list.length))
    //对于类型进行匹配
    s match{
      case a : Int if(a > -1) => println(a)
      case a : String => println("字符串")
      case TypeDemo => println(TypeDemo)
    }
  }
}

数组匹配

package cn.edu.hust.cases

object ArrayMatch extends App{
  val array=Array(1,2,3,4,19)
  //进行array的匹配
  array match{
    case Array(2,3,x) => println(x)
    case Array(1,2,x,y) => println(x+" "+y)
    case Array(1,_*) => println("0....")
    case _=> throw new Exception("没有这种类型")
  }

  val list=List(1,2,3)
  list match{
    case 1::Nil=>println("1....")
    case 1::x::y=>println(s"$x")
    case 0::tail=>println("0....")
    case _=>throw new Exception("匹配错误")
  }

  val t=(1,26,9)
  t match {
    case (1,2,x)=>println(s"$x")
    case (1,x,y)=>println(s"$x   $y")
    case (1,_,10) =>println("....")
  }
}

样例类

    在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的

package cn.edu.hust.cases

import scala.util.Random

//样例类
case class Person(name:String,age:Int)
//样例类
case class life(time:Int)
//样例对象
case object money
object Partical extends App {
  val array=Array(Person("zhangsan",10),life(80),money)
  val t=array(Random.nextInt(array.length))
  t match{
    case Person(name,age) => println(s"$name $age")
    case life(time) => println(s"$time")
    case money => println(money)
  }
}

Option类型

    在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值。

package cn.edu.hust.option

object OptionDemo extends App{
  val map=Map(("a",1),("b",10))
  //使用option类进行模式匹配,
  val m=map.get("a") match
  {
      //如果匹配的到,那么将会返回
    case Some(i) => i
      //如果没有匹配到将会返回0
    case None =>0
  }
  println(m)

  //还有一个更好的方法那就是使用下列方法
  val m2=map.getOrElse("c",0)
  println(m2)
}

偏函数

        被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配。

package cn.edu.hust.partical

class ParticalFunctionDemo {
  //这是一份偏函数,有PartialFunction声明,第一个参数是case里面匹配,第二个参数是返回值
  def func1:PartialFunction[String,Int]={
    case "one"=>1
    case "two"=>2
    case _ => throw new Exception("调用方法错误")
  }
  //这是一个普通的函数,里面有模式匹配
  def func2(num:String):Int=num match{
    case "one"=>1
    case "two"=>2
    case _=>throw new Exception("调用方法错误")
  }
}
object ParticalFunctionDemo extends App
{
  val p=new ParticalFunctionDemo
  val result=p.func1("one")
  println(result)
  val result2=p.func2("two")
  println(result2)
}