scala总结

一、var,val和def三个关键字之间的区别
var:是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改。
val:常量声明关键字。
def:关键字用于创建方法(注意方法和函数的区别)。


二、方法和函数的区别
在Scala中方法不是值,而函数是。所以一个方法不能赋值给一个val变量,而函数可以。
如:def increment(n: Int) = n + 1 //方法
val fun = increment //错误
val fun = increment _ //正确


三、trait
trait可以有:属性,方法(有具体实现),抽象方法;通过extends继承trait,如果要继承多个trait,用with


四、 trait(特质)和abstract class(抽象类)的区别
1、一个类只能集成一个抽象类,但是可以通过with关键字继承多个特质;
2、抽象类有带参数的构造函数,特质不行(如 trait t(i:Int){} ,这种声明是错误的)


五、object和class的区别
object是类的单例对象,开发人员无需用new关键字实例化。如果对象的名称和类名相同,这个对象就是伴生对象
Class和Object都可以定义自己的Apply()方法,类名()调用Object下的Apply()方法,变量名()调用Class下的Apply()方法。


六、构造函数
1、主构造函数在类名后,通过new一个对象时,会执行类名后的语句;类名后面括号包含的参数就是构造器的参数。
2、次构造器必须调用主构造器


七、case class(样本类)
当声明了一个 case class,Scala编译器做了这些:
1、创建伴生object
2、实现了apply方法让你不需要通过new来创建类实例
3、默认为主构造函数参数列表的所有参数前加 val
4、默认实现了toString,equals,hashcode,copy等方法
5、样本类可以通过==比较两个对象,并且不在构造方法中定义的属性不会用在比较上。
6、由于编译器实现了 unapply 方法,一个 case class 支持模式匹配


八、Option、Some、None
Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
Option[T]是一个类型为T的可选值的容器:如果值存在,Option[T]就是一个Some[T] 如果不存在,Option[T]就是对象None。
Some和None是Option的子类。如果有值,即返回Some[T],可以通过get方法获取具体的值


九、apply方法与unapply方法
可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象,从中提取值。
unapply主要应用于模式匹配(match)上


十、Unit类型
Unit代表没有任何意义的值类型,类似于java中的void类型


十一、call-by-value和call-by-name求值策略的区别
1、call-by-value:callByValue(x: Int) ,x是在调用函数之前计算出结果;
2、call-by-name:callByName(x: => Int),x是在函数中,需要使用到时才计算出结果,如果传给callByName的是一个函数f,
函数f的返回值是Int类型,则在函数callByName中,用到x的地方就会换成函数f。


十二、yield
yield用于循环迭代中生成新值,如for (i <- 1 to 5) yield i * 2  返回Vector(2, 4, 6, 8, 10)


十三、隐式详解(implicit关键字)
1、隐式参数:当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个
隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可。 当调用包含隐式参数的
方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标
记为隐式参数的我们也可以手动为该参数添加默认值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)
在上下文中要有类似implicit val t1 = "a" 的变量存在。
2、隐式地转换类型:当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义
val i: Int = 3.5 //直接报错
implicit def double2Int(d: Double) = d.toInt
val i: Int = 3.5  //i=3
3、隐式调用函数
隐式调用函数可以转换调用方法的对象,比如但编译器看到X.method,而类型X没有定义 method(包括基类)方法,那么编译器
就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型Y定义了 method 方法,编译器就首先使用隐含类型转换把 X
转换成 Y,然后调用 Y 的 method。


十四、函数柯里化
有多个参数列表的函数就是柯里化函数;给部分参数列表传递值,将返回另一个函数。


十五、尾递归
正常递归,每一次递归步骤,需要保存信息到堆栈里面,当递归步骤很多时,导致堆栈溢出。
尾递归是指递归调用是函数的最后一个语句,而且其结果被直接返回,这是一类特殊的递归调用。由于递归结果总是直接返回,
尾递归比较方便转换为循环,因此编译器容易对它进行优化。可使用Scala提供的尾递归标注@scala.annotation.tailrec,
这个符号除了可以标识尾递归外,更重要的是编译器会检查该函数是否真的尾递归,若不是,会导致如下编译错误。


十六、高阶函数
高阶函数指能接受或者返回其他函数的函数,scala中的filter map flatMap函数都能接受其他函数作为参数。


十七、闭包
闭包是一个函数,它返回值不仅取决于内部参数,还取决于在此函数之外声明的一个或多个变量的值。
var factor = 3
val multiplier = (i:Int) => i * factor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值