【Scala】积累与发现

基础

官网教程


我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这个东西尽量少用

面向对象

构造

Scala之主构造函数
scala 辅助构造器 主构造器

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中的override

对象

包对象
包对象是scala提供的一种概念,本质上还是一个对象,只不多它与包进行了绑定,就是公交车,把公用的东西丢到保对象里面
Scala的Case Classes的重载构造函数?
scala 对象的相等

异常

学习Scala:使用try-catch表达式处理异常

语法糖

map+case结构使用技巧
Meaning of additional colon in Scala class parametrization

apply

scala中的apply方法与unapply方法

//用法举例
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-apply的几种用法

反射

反射概览
scala的反射需要一个scala-reflect的依赖,并且scala反射的设计是生成镜像,然后用这个镜像去获取类镜像、方法镜像或者实例镜像,然后再用这些镜像去操作。有点麻烦。

常见api

字符串

scala字符串格式化-StringLike.format()

Option Some None

Scala 技术笔记之 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方法

JAVA和SCALA容器的转换

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程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值