【Scala】——积累与发现

Scala方法和函数的区别
Scala容器官方全解
SCALA中:: , +:, :+, :::, +++的区别
【Scala笔记——道】Scala 循环遍历 for详解

scala要让对象可以用for循环,这个类有foreach方法就可以扔进for循环里,不像java里一定要实现Iterable借口

Intellij IDEA:当右键运行时出现了Run Scala console,而没有run操作的原因
idea 无法创建Scala class 选项解决办法汇总
IntelliJ IDEA 中 右键新建(new)时,选项没有scala(java) class的解决方法和具体解释
在IDE下开发第一个Scala程序
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 技术笔记之 Option Some None
scala(一)Nothing、Null、Unit、None 、null 、Nil理解

scala中所有方法都必须返回一个对象的,空方法也不例外地返回了一个(),因此这时候就需要Nothing来作为方法执行出错时候的返回值了
null在java中是关键字,而在scala里是对象,scala里什么东西都是对象,另外,虽说Null是所有自定义类的子类,但如果涉及泛型[T],那么Null并不是这个未指定的泛型T的子类,因为T有可能是AnyVal类型的,并且官方文档说,请不要在scala代码里用null这个东西

scala的无参函数什么时候加括号,什么时候不加括号
Scala 中不带括号的函数与带括号函数的差别

有副作用要加括号,没有副作用可省略括号

Scala之小括号和花括号(Parentheses & Crurly Braces)
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

new 对象加括号和不加括号的区别
Scala中的None,Nothing,Null,Nil
Scala 隐式(implicit)详解
Scala基础 - 传名参数和传值参数(by-name/by-value parameter)
Scala从零开始:函数参数的传名调用(call-by-name)和传值调用(call-by-value)
Scala 中Array,List,Tuple的差别

感觉list是用linked实现的

fold/foldLeft/foldRight区别和联系
scala的aggregate
Scala之偏函数Partial Function
Scala学习笔记(六) Scala的偏函数和偏应用函数
THE SCALA ACTORS API

Actor是已经废弃的,但是要是想用的话,需要scala2.9及之前版本,并且jdk要1.7及以前的版本

Scala 文件操作
深入理解scala的柯里化( currying or curry )以及其用处
Scala类型检查与转换 isInstanceOf、asInstanceOf
scala类型系统:类型与类

scala的类型系统,泛型不同的类的getClass也不一样,而java里泛型不同的类的getClass是相同的,泛型的类型检查只在编译阶段进行,运行阶段所有的泛型类的类都是一样的

Scala 异常详解
scala基础之泛型详解
Scala学习——泛型[T]的6种使用(初)

协变[A+]与上确界[A<:B]有什么联系呢,你要记住协变和上确界什么的没有任何联系和关联,用法可能相似,但他们是完全不同的东西,这方面上面两个博客写的都不好,推荐去看官方的tutorial

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]是父类与子类的关系,所以编译可以通过

Scala中的override
Scala比较器:Ordered与Ordering
scala字符串格式化-StringLike.format()

猜你喜欢

转载自blog.csdn.net/dominic_z/article/details/88615496