Scala柯里化、样例类和模式匹配

柯里化(Currying)

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

//单参数列表
def modN(n: Int,x: Int) = ((x % n) == 0)
//多参数列表
def modN(n: Int)(x: Int) = ((x % n) == 0)
//新函数接收剩余的参数列表作为其参数
def f1(x: Int) = modN(10)(x) 
def f2(n: Int) = modN(n)(10) 
def f3 = modN(10)(_)  

示例

object test {
  def main(args: Array[String]): Unit = {
    def fun1(a:Int,b:Int,c:Int,d:Int):Int={
      a+b+c+d
    }
    def fun2(a:Int,b:Int,c:Int)(d:Int):Int={
      a+b+c+d
    }
    def fun3(a:Int,b:Int)(c:Int,d:Int):Int={
      a+b+c+d
    }
    def fun4(a:Int)(b:Int,c:Int,d:Int):Int={
      a+b+c+d
    }
    def fun5(a:Int)(b:Int)(c:Int)(d:Int):Int={
      a+b+c+d
    }
    println(fun1(1,2,3,4))
    println(fun2(1,2,3)(4))
    println(fun3(1,2)(3,4))
    println(fun4(1)(2,3,4))
    println(fun5(1)(2)(3)(4))
  }
}

样例类(case class)

样例化常用于描述不可变的值对象(Value Object)

case class Student(name:String,age:Int)      //定义样例类
val stu=Student("Jason",19)      //创建样例类的实例,无需new关键字
println(stu.name)       //访问对象属性                                       
  • 样例类构造参数默认声明为"val",自动实现类构造参数的getter

  • 样例类构造参数声明为"var"时,自动实现类构造参数的setter和getter

  • 样例类自动创建伴生对象

  • 样例类自动实现的其他方法

 toString()、equals()、copy()、hashCode()
 伴生对象中的apply()、unapply()
 //unapply()接受一个对象,从对象中提取出相应的值,主要用于模式匹配中

模式匹配

match表达式模式匹配

类似于Java switch语句

  • 能处理类型所有类型
  • 不需要break
  • 能够生成值
val firstArg=if(args.length>0) args(0) else ""
firstArg match{
    case "salt" => println("pepper")
    case "chips" => println("salsa")
    case "eggs" => println("bacon")
    case _ => println("huh?")	//以上未列出的值,使用“_”表示
}

基本模式匹配

object test {
  def main(args: Array[String]): Unit = {
    def testMatch(a:Int):String=a match {
      case 1=>"one"
      case 2=>"two"
      case _=>"many"
    }
    println(testMatch(1))
    println(testMatch(2))
    println(testMatch(3))
  }
}

object test {
  def main(args: Array[String]): Unit = {
    def studentScore(score:String):Unit=score match {
      case "A"=>println("超级棒")
      case "B"=>println("很不错")
      case "C"=>println("还行")
      case _=>println("需要加油")
    }
    studentScore("A")
    studentScore("B")
    studentScore("c")
    studentScore("D")
  }
}

模式守卫(在模式后面加上if条件)

object test {
  def main(args: Array[String]): Unit = {
    def studentScore(name:String,score:String):Unit=score match {
      case "A"=>println("超级棒")
      case "B"=>println("很不错")
      case "C"=>println("还行")
      case _ if name=="老王"=>println("你是最棒的")
      case _=>println("加油")
    }
    studentScore("老王","D")
  }
}
import java.io.FileNotFoundException

object test {
  def main(args: Array[String]): Unit = {
    def exception(e:Exception):Unit=e match {
      case e1:IllegalArgumentException=>println("IllegalArgumentException")
      case e2:FileNotFoundException=>println("FileNotFoundException")
      case e3:IndexOutOfBoundsException=>println("IndexOutOfBoundsException")
      case _:Exception=>println("Exception")
    }
    exception(new IllegalArgumentException)
    exception(new FileNotFoundException)
    exception(new IndexOutOfBoundsException)
    exception(new Exception)
  }
}

对Array和List的元素进行模式匹配

object test {
  def main(args: Array[String]): Unit = {
    def array(arr:Array[String]):Unit=arr match {
      case Array("kb09")=>println("hello,kb09")
      case Array(boy1,boy2,boy3)=>println(s"hello $boy1 & $boy2 & $boy3")
      case Array("kb09",_*)=>println("hi,kb09!")
      case _=>println("who are you")
    }
    array(Array("kb09"))
    array(Array("kb09","kb08","kb07"))
    array(Array("kb09","kb08","kb07","kb06"))
    array(Array("kb08","kb09"))
  }
}

Option与模式匹配

object test {
  def main(args: Array[String]): Unit = {
    val grades=Map("Leo"->"A","Jack"->"B","Jen"->"C")
    def getGrade(name:String):Unit ={
      val grade=grades.get(name)
      grade match {
        case Some(grade)=>println("your grade is "+grade)
        case None=>println("sorry,your grade information is not in the system")
      }
    }
    getGrade("Leo")
    getGrade("Jack")
    getGrade("Jen")
    getGrade("Zhang")
  }
}

样例类模式匹配

object test {
  def main(args: Array[String]): Unit = {
    case class Teacher(name:String,age:Int)
    def testMatch(teacher: Teacher):Unit=teacher match {
      case Teacher("老王", 18) => println("hello,老王")
      case Teacher("老张", 28) => println("hello,老张")
      case Teacher(name, age)=>println(s"hello,$name")
    }
    testMatch(Teacher("老王",18))
    testMatch(Teacher("老张",28))
    testMatch(Teacher("老林",38))
  }
}

object test {
  def main(args: Array[String]): Unit = {
    class Person
    case class Teacher(name:String,subject:String) extends Person
    case class Student(name:String,classroom:Int) extends Person
    case class Worker(name:String,work:String) extends Person
    case class Stranger() extends Person
    def a(p:Person):Unit=p match {
      case Teacher(name,subject)=>println(s"hello,$name,welcome to school,you teach $subject")
      case Student(name,classroom)=>println(s"hello,$name,welcome to school,your classroom is $classroom")
      case Worker(name,work)=>println(s"hello,$name,you should leave school 2 hours later")
      case _=>println(s"stranger,you can not into shcool")
    }
    a(Teacher("老张","大数据"))
    a(Student("小明",9))
    a(Worker("老王","cleaner"))
    a(Stranger())
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 来表示数据库表,使用的实例表示表中的行。 开发者可以定义之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值