3-scala高级
1、模式匹配
//①简单表示:
sign = ch match {
case '+' => 1
case '-' => -1
case '_' => 0
} //②守卫:(case中加条件)
grade match {
case "A" => println(name + ", you are excellent")
case "B" => println(name + ", you are good")
case _ if name == "leo" => println(name + ", you are a good boy, come on") //只有名字是leo,不管成绩是多少,打印
case _ => println("you need to work harder")
} //③匹配类型:
e match {
case e1: IllegalArgumentException => println("you have illegal arguments! exception is: " + e1)
case e2: FileNotFoundException => println("cannot find the file you need read or write!, exception is: " + e2)
case e3: IOException => println("you got an error while you were doing IO operation! exception is: " + e3)
case _: Exception => println("cannot know which exception you have!" )
}
注:对异常的类型进行匹配(也可以对int,string等类型进行匹配) //④匹配集合: arr match {
case Array("Leo") => println("Hi, Leo!")
case Array(girl1, girl2, girl3) => println("Hi, girls, nice to meet you. " + girl1 + " and " + girl2 + " and " + girl3)
case Array("Leo", _*) => println("Hi, Leo, please introduce your friends to me.")
case _ => println("hey, who are you?")
}
注:匹配数组是集个参数,并且对值进行了匹配(集合也可以匹配) //⑤样例类: case class Student(id:Int,name:String) //类似于类一样,只不过封装了get,set,hashcode等方法,很重要
val student1 = Student(1,"lihaozong") //⑥Option: 用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值。
2、特质(trait)
trait类似于java中的接口,不同的是trait中可以定义变量、定义函数及其实现
trait ConsoleLogger{
def log(msg:String){println(msg)}
}
3、隐式转换
分为隐式转换和参数:可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来
关键字: implicit
1、隐式参数
当调用函数的时候,发现参数个数不会,编译器回去隐式参数里去找,看看有没有同一类型的隐式参数,如果有,则用此
object Test{
def k1(x:Int,y:Int):Int=x+y
def k2(x:Int)(implicit y:Int=5):Int=x+y
def main(args: Array[String]): Unit = {
println(k1(2,3))
//
println(k2(5))
//
}
}
注:编译器在调用k2的时候发现只穿了一个参数,这时就会在上下文中寻找有没有隐式参数,如果有,就调用隐式参数。
object Test7 {
implicit var b:Int=10
def k2(x:Int, y:Int=5):Int=x+y
def main(args: Array[String]): Unit = {
println(k2(5))
//
}
}
注:可以发现隐式参数是分类型的
object Test7 {
implicit var b:Int=10
implicit var c:Int=15
def k2(x:Int)(implicit y:Int=5):Int=x+y
def main(args: Array[String]): Unit = {
println(k2(5))
}
}
注:这会报错,同一类型的隐式参数只有一个
2、隐式转化:
当一个对象想要调用一个方法,但是这个对象又没有该方法,这时会触发隐式转换。
编译器回去隐式方法里去找,看有没有这样一个隐式函数,把我这个对象转换为有这个方法的对象。
如果我变成了这个对象后,不就有这个方法了吗?
class Man(val name:String){}
class SuperMan(val name:String){
def fly():Unit={
println("超人会飞")
}
}
object Test7 {
implicit def man2SuperMan(man: Man):SuperMan=new SuperMan("")
def main(args: Array[String]): Unit = {
val man=new Man("abc")
man.fly()
}
}
注:开始定义了Man、SuperMan两个类,但是Man没有fly(),当使用这个方法,编译器会去寻找是否一个隐式转化使得Man-->SuperMan,
如果找到(参数为Man类型,返回值为SuperMan),就进行转化,再调用方法
3-scala高级的更多相关文章
- Scala进阶之路-Scala高级语法之隐式(implicit)详解
Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- scala 高级编程
一.函数式编程 Scala中的函数可以独立存在, 不需要依赖任 何类和对象 def 放在类中就是方法:放在外边就是函数 1.将函数赋值给变量 Scala中的函数是一等公民, 可以独立定义, 独立存在 ...
- scala高级性质-隐式转换 -02
今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换 1.隐式转换的例子 read的例子 解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面 ...
- scala高级内容(二) - Implicit
一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...
- scala高级内容(一) Case Class
一. 操作符 自定义操作符 操作付默认左结合调用.除了以:结尾的操作符是右结合调用 object OperaterTest extends App{ val a: myInt = new myInt( ...
- 大数据之scala高级语法学习
协变 案例一: class Animal {} class Bird extends Animal {} class Animal {} class Bird extends Animal {} // ...
- 京东商城招聘scala 高级开发工程师 T3级别
岗位级别:T3 岗位职责: 1.参与自动调价.匹配系统的设计和实现 岗位要求: 1. 一年以上scala开发经验2.良好的函数式编程能力3. JAVA基础扎实4.熟悉大数据处理,有hadoop/hba ...
- Scala高级语法
一.隐式 implicit分类: (1)隐式参数 (2)隐式转换类型 (3)隐式类 特点:让代码变得更加灵活 (一)隐式参数 1.ImplicitTest object ImplicitTest { ...
- scala高级特性-01
目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...
随机推荐
- activemq jms使用
activemq 是 基于 jms 协议的 消息队列 消息 流程: jsm 的 消息流程鼻尖简单 生产者发送消息到目的地,消费者 监听这个目的地,然后收到消息. 相比 amqp 的 消息流程简单很多 ...
- MongoDB 设置账号和密码
一.安装MongoDB 1.环境配置: i.操作系统:CentOS release 6.8 (Final) [root@iZ2ze2pbbffhmn53ao4tuaZ bin]# cat /etc/r ...
- LOJ 3056 「HNOI2019」多边形——模型转化+树形DP
题目:https://loj.ac/problem/3056 只会写暴搜.用哈希记忆化之类的. #include<cstdio> #include<cstring> #incl ...
- Jmeter性能监测及安装插件(推荐)
本文部分理论转自Jmeter官网:https://jmeter-plugins.org/wiki/PerfMon/ ,并结合个人实践编写 一.介绍 在负载测试期间,了解加载服务器的运行状况很重要.如 ...
- 安装chrome扩展json-handle
chrome插件安装 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json-handle/iah ...
- C#实现设置系统时间
using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Demo { pub ...
- oracle数据库使用小结
select * from r_patient a where a.birthdate= to_date('1953-03-01','yyyy-mm-dd');select * from r_pati ...
- Winfrom控件使用
1.Lablelable添加图片,解决图片和字体重叠? Text属性添加足够空格即可,显示效果如下所示: 2.根据窗体名称获取窗体并显示到指定panel? Label item = sender as ...
- 好消息:手机上也可以使用Firebug功能了
做前端开发的小伙伴儿应该对火狐浏览器提供的Firebug工具很熟悉了吧,但是你知道怎么在手机上使用Firebug的控制台功能么(^_-) 现在谷歌浏览器提供了可以在电脑上模拟移动端界面的功能,但是在开 ...
- 黄聪:AngularJS如何在filter中相互调用filter
调用方式如下: app.filter('filter2', function( $filter ) { return function( input) { return $filter('filter ...