1、模式匹配

  1. //①简单表示:
  2. sign = ch match {
  3. case '+' => 1
  4. case '-' => -1
  5. case '_' => 0
  6. }
  7.  
  8. //②守卫:(case中加条件)
  9. grade match {
  10. case "A" => println(name + ", you are excellent")
  11. case "B" => println(name + ", you are good")
  12. case _ if name == "leo" => println(name + ", you are a good boy, come on") //只有名字是leo,不管成绩是多少,打印
  13. case _ => println("you need to work harder")
  14. }
  15.  
  16. //③匹配类型:
  17. e match {
  18. case e1: IllegalArgumentException => println("you have illegal arguments! exception is: " + e1)
  19. case e2: FileNotFoundException => println("cannot find the file you need read or write!, exception is: " + e2)
  20. case e3: IOException => println("you got an error while you were doing IO operation! exception is: " + e3)
  21. case _: Exception => println("cannot know which exception you have!" )
  22. }
  23. 注:对异常的类型进行匹配(也可以对intstring等类型进行匹配)
  24.  
  25. //④匹配集合:
  26.  
  27. arr match {
  28. case Array("Leo") => println("Hi, Leo!")
  29. case Array(girl1, girl2, girl3) => println("Hi, girls, nice to meet you. " + girl1 + " and " + girl2 + " and " + girl3)
  30. case Array("Leo", _*) => println("Hi, Leo, please introduce your friends to me.")
  31. case _ => println("hey, who are you?")
  32. }
  33. 注:匹配数组是集个参数,并且对值进行了匹配(集合也可以匹配)
  34.  
  35. //⑤样例类:
  36.  
  37. case class Student(id:Int,name:String) //类似于类一样,只不过封装了get,set,hashcode等方法,很重要
  38. val student1 = Student(1,"lihaozong")
  39.  
  40. //⑥Option:
  41.  
  42. 用来表示可能存在或也可能不存在的值(Option的子类有SomeNone)。Some包装了某个值,None表示没有值。

2、特质(trait)

  1.     trait类似于java中的接口,不同的是trait中可以定义变量、定义函数及其实现
  1. trait ConsoleLogger{
  2. def log(msg:String){println(msg)}
  3. }

3、隐式转换

    分为隐式转换和参数:可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来

    关键字: implicit

  1、隐式参数

  1.     当调用函数的时候,发现参数个数不会,编译器回去隐式参数里去找,看看有没有同一类型的隐式参数,如果有,则用此
  1.  
  2. object Test{
  3.  
  4. def k1(x:Int,y:Int):Int=x+y
  5.  
  6. def k2(x:Int)(implicit y:Int=5):Int=x+y
  7.  
  8. def main(args: Array[String]): Unit = {
  9.  
  10. println(k1(2,3))
  11. //
  12. println(k2(5))
  13. //
  14. }
  15.  
  16. }
  17.  
  18. 注:编译器在调用k2的时候发现只穿了一个参数,这时就会在上下文中寻找有没有隐式参数,如果有,就调用隐式参数。
  19.  
  20. object Test7 {
  21.  
  22. implicit var b:Int=10
  23.  
  24. def k2(x:Int, y:Int=5):Int=x+y
  25.  
  26. def main(args: Array[String]): Unit = {
  27.  
  28. println(k2(5))
  29. //
  30. }
  31.  
  32. }
  33. 注:可以发现隐式参数是分类型的
  34.  
  35. object Test7 {
  36.  
  37. implicit var b:Int=10
  38.  
  39. implicit var c:Int=15
  40.  
  41. def k2(x:Int)(implicit y:Int=5):Int=x+y
  42.  
  43. def main(args: Array[String]): Unit = {
  44.  
  45. println(k2(5))
  46.  
  47. }
  48.  
  49. }
  50.  
  51. 注:这会报错,同一类型的隐式参数只有一个

2、隐式转化: 

    当一个对象想要调用一个方法,但是这个对象又没有该方法,这时会触发隐式转换。
    编译器回去隐式方法里去找,看有没有这样一个隐式函数,把我这个对象转换为有这个方法的对象。
    如果我变成了这个对象后,不就有这个方法了吗?

  1. class Man(val name:String){}
  2. class SuperMan(val name:String){
  3. def fly():Unit={
  4. println("超人会飞")
  5. }
  6. }
  7.  
  8. object Test7 {
  9. implicit def man2SuperMan(man: Man):SuperMan=new SuperMan("")
  10. def main(args: Array[String]): Unit = {
  11. val man=new Man("abc")
  12. man.fly()
  13. }
  14. }
  15.  
  16. 注:开始定义了ManSuperMan两个类,但是Man没有fly(),当使用这个方法,编译器会去寻找是否一个隐式转化使得Man-->SuperMan,
  17. 如果找到(参数为Man类型,返回值为SuperMan),就进行转化,再调用方法

3-scala高级的更多相关文章

  1. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  2. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  3. scala 高级编程

    一.函数式编程 Scala中的函数可以独立存在, 不需要依赖任 何类和对象 def  放在类中就是方法:放在外边就是函数 1.将函数赋值给变量 Scala中的函数是一等公民, 可以独立定义, 独立存在 ...

  4. scala高级性质-隐式转换 -02

    今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换 1.隐式转换的例子 read的例子 解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面 ...

  5. scala高级内容(二) - Implicit

    一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...

  6. scala高级内容(一) Case Class

    一. 操作符 自定义操作符 操作付默认左结合调用.除了以:结尾的操作符是右结合调用 object OperaterTest extends App{ val a: myInt = new myInt( ...

  7. 大数据之scala高级语法学习

    协变 案例一: class Animal {} class Bird extends Animal {} class Animal {} class Bird extends Animal {} // ...

  8. 京东商城招聘scala 高级开发工程师 T3级别

    岗位级别:T3 岗位职责: 1.参与自动调价.匹配系统的设计和实现 岗位要求: 1. 一年以上scala开发经验2.良好的函数式编程能力3. JAVA基础扎实4.熟悉大数据处理,有hadoop/hba ...

  9. Scala高级语法

    一.隐式 implicit分类: (1)隐式参数 (2)隐式转换类型 (3)隐式类 特点:让代码变得更加灵活 (一)隐式参数 1.ImplicitTest object ImplicitTest { ...

  10. scala高级特性-01

    目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...

随机推荐

  1. 第一个appium的Demo

    原文来自:一颗糖果  http://www.cnblogs.com/linglingyuese/articles/8418311.html 一.环境搭建 略(后期补) 二.创建一个测试apk包的项目 ...

  2. win7重装系统笔记

    制作U盘启动盘:链接 原文链接:链接 开机进入bios界面(华硕:F2) 按方向左右键进入:Boot选项,将“Lunch CSM”设置为“Enabled” 方向键选择“Security”,将“Secu ...

  3. EntityFrameworkCore操作记录

    Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design -Version 2.0.3 Add-Migration Init U ...

  4. hadoop不同版本有哪些

    一.Hadoop是什么? 首次听到hadoop这次单词,相信很多人跟我当时是一样,不免心中画上一个大大的问号——这是什么东西?Hadoop是什么?百度百科的解释是:Hadoop是一个由Apache基金 ...

  5. [转]Python中出错:ImportError: No module named win32com.client

    Python中出错:ImportError: No module named win32com.client [问题] [已解决]Python中处理操作Excel中的图表(Chart,Graph) 的 ...

  6. 基于selector的socket并发

    server: #!_*_coding:utf-8_*_ #__author__:"Alex huang" import selectors #selector模块集成了selec ...

  7. 打开RAD Studio XE5提示"displayNotification:内存不够"解决办法

    操作方法: 在RAD Studio XE5快捷方式上鼠标右击选择属性,在弹出的快捷方式标签页中将目标(T):"C:\Program Files (x86)\Embarcadero\RAD S ...

  8. js图片预加载后触发操作

    为了使得图片加载完,再触发回调函数,需进行图片预加载处理 function loadImage(url, callback) { var img = new Image(); img.src = ur ...

  9. WPF Demo13 GridSplitter

    <Window x:Class="Commands.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...

  10. mybatis传入List实现批量更新

    如果要在一个update里面执行多条更新语句,只需要在jdbc:url后面跟上allowMultiQueries=true的参数,比如: jdbc:mysql://127.0.0.1:3306/tes ...