基础
我TM今天发现一件事,scala定义负数,等号和符号之间必须带空格,我猜是不是因为scala里万物都是方法和对象的缘故。
2019.3.31 在传入方法的时候,比如说map(a:Int=>a+1)
和map(_+1)
是一样的,但是不能写成map(_=>_+1)
语法
符号
SCALA中:: , +:, :+, :::, +++的区别
Scala特殊符号汇总
方法函数
Scala方法和函数的区别
Scala Functions vs Methods
function是一个完整的对象,但methods只是一个代码块。
Scala基础 - 传名参数和传值参数(by-name/by-value parameter)
Scala从零开始:函数参数的传名调用(call-by-name)和传值调用(call-by-value)
Scala之偏函数Partial Function(解释了{case })
Scala之小括号和花括号(Parentheses & Crurly Braces)
深入理解scala的柯里化( currying or curry )以及其用处
scala的无参函数什么时候加括号,什么时候不加括号
Scala 中不带括号的函数与带括号函数的差别
有副作用要加括号,没有副作用可省略括号
函数柯里化(Currying)和偏函数应用(部分应用函数)(Partial Application)的比较
curry是每次输入一个参数,每次调用返回一个函数;而偏函数只是固定部分参数,但仍然是执行操作
隐式转换
Scala 隐式(implicit)详解
函数最后一个参数列表可以用关键字“implicit”声明为隐式的,这样整个参数列表的参数都是隐式参数。注意,是整个参数列表,即使括号里有多个参数,也只需要开头写一个“implicit”。而且每个参数都是隐式的,不存在部分隐式部分显式。
def greet(name: String)(implicit prompt: PreferredPrompt, drink: PreferredDrink)
条件判断
Scala中match case模式匹配
Scala中的case match语法
Using comparison operators in Scala’s pattern matching system
循环
Scala学习日志(三)——轻便神奇的for推导式
How do I break out of a loop in Scala?
限定符
Scala - Access Modifiers:private和private[this]
类型
scala类型系统:类型与类
scala的类型系统,泛型不同的类的getClass也不一样,而java里泛型不同的类的getClass是相同的,泛型的类型检查只在编译阶段进行,运行阶段所有的泛型类的类都是一样的
Scala类型检查与转换 isInstanceOf、asInstanceOf
Scala中的None,Nothing,Null,Nil
scala(一)Nothing、Null、Unit、None 、null 、Nil理解
scala中所有方法都必须返回一个对象的,空方法也不例外地返回了一个(),因此这时候就需要Nothing来作为方法执行出错时候的返回值了
null在java中是关键字,而在scala里是对象,scala里什么东西都是对象,另外,虽说Null是所有自定义类的子类,但如果涉及泛型[T],那么Null并不是这个未指定的泛型T的子类,因为T有可能是AnyVal类型的,并且官方文档说,请在scala代码里用null这个东西尽量少用
面向对象
构造
class C[T]{
val t:T=_
val i:Int=_
}
# 在scala里所有对象都需要有一个实际的值,_为某成员变量默认值,不同的类型对应着不同的默认值,这个赋予默认值的操作是在运行时期进行的
# 需要注意的是,在未指定泛型T的时候,Null并不一定是T的子类(因为T有可能是AnyVal类型的),所以编译期不能给t赋值为null,实际上编译期不能给t赋任何实际的值;只有当指定好了泛型类具体是什么的时候,根据指定的泛型类的不同,在运行期给这个t赋予不同的默认值,可能是null,可能是0等等
# 这也体现了scala和java的不同,java的int是基本类型,并且对应有Integer这个包装类,scala没有基本类型和包装类型的概念,只有anyval和anyref
scala的定义变量的时候一定要初始化吗?如果不想初始化怎么办?
new 对象加括号和不加括号的区别
继承
对象
包对象
包对象是scala提供的一种概念,本质上还是一个对象,只不多它与包进行了绑定,就是公交车,把公用的东西丢到保对象里面
Scala的Case Classes的重载构造函数?
scala 对象的相等
异常
语法糖
map+case结构使用技巧
Meaning of additional colon in Scala class parametrization
apply
//用法举例
class Money(val value: Double, val country: String) {}
object Money {
def apply(value: Double, country: String) : Money = new Money(value, country)
def unapply(money: Money): Option[(Double, String)] = {
if(money == null) {
None
} else {
Some(money.value, money.country)
}
}
}
val Money(num,country)=Money(10.1, "RMB1")
反射
反射概览
scala的反射需要一个scala-reflect的依赖,并且scala反射的设计是生成镜像,然后用这个镜像去获取类镜像、方法镜像或者实例镜像,然后再用这些镜像去操作。有点麻烦。
常见api
字符串
scala字符串格式化-StringLike.format()
Option Some None
order
Scala比较器:Ordered与Ordering
scala排序——ordering vs ordered
容器对象
【Scala笔记——道】Scala 循环遍历 for详解
scala要让对象可以用for循环,这个类有foreach方法就可以扔进for循环里,不像java里一定要实现Iterable借口
Scala容器官方全解
Scala 中Array,List,Tuple的差别
感觉list是用linked实现的
fold/foldLeft/foldRight区别和联系
scala中的reduceLeft,reduceRight,foldLeft,foldRight方法
打印Array对象,可以用mkString
方法
IO
如何从Scala资源文件夹读取文件?
需要使用类加载器getClass.getClassLoader.getResourceAsStream
范型
scala基础之泛型详解
Scala学习——泛型[T]的6种使用(初)
协变[A+]与上确界[A<:B]有什么联系呢,你要记住协变和上确界什么的没有任何联系和关联,用法可能相似,但他们是完全不同的东西,这方面上面两个博客写的都不好,推荐去看官方的tutorial,上面scala全部符号中对协变的解释很好,由于java的范型使用的是擦除完成的,但scala的范型是不擦除的,因此协变解决的就是带范型的类之间的继承关系。
class Father{}
class Child extends Father{}
class GenericClass1[T1<:Father]{
def print(a:GenericClass1[T1]):Unit={println("Hey!class!")}
}
class GenericClass2[+T1]{
def print[T2>:T1](a:GenericClass2[T2]):Unit={println("Hey!class!")}
}
object Test extends App{
def print(a:GenericClass1[Father]):Unit={println("Hey!class!")}
val g1Father=new GenericClass1[Father]()
val g1Child=new GenericClass1[Child]()
this.print(g1Father)
// 下面的语句编译不通过
// this.print(g1Child)
def print(a:GenericClass2[Father]):Unit={println("Hey!class!")}
val g2Father=new GenericClass2[Father]()
val g2Child=new GenericClass2[Child]()
this.print(g2Father)
this.print(g2Child)
// 进阶,下面代码编译可通过,原因请自行理解
// 提示,由于协变的缘故,GenericClass2[T2]是GenericClass2[T1]的父类
// g2Father.print需要一个是“GenericClass2[Father]的父类型(暂称为类型C)”的对象,即传入类型C的任何子类型也是OK的,而GenericClass1[Child]是GenericClass2[Father]的子类型
g2Father.print(g2Father)
g2Father.print(g2Child)
g2Child.print(g2Father)
g2Child.print(g2Child)
}
解释,GenericClass1[Father]和GenericClass1[Child]是两个不同的类;但由于协变的关系,GenericClass2[Father]和GenericClass2[Child]是父类与子类的关系,所以编译可以通过
配置
Intellij IDEA:当右键运行时出现了Run Scala console,而没有run操作的原因
idea 无法创建Scala class 选项解决办法汇总
IntelliJ IDEA 中 右键新建(new)时,选项没有scala(java) class的解决方法和具体解释
在IDE下开发第一个Scala程序