学习scala文档

首先先看一个helloworld程序:

 

 和java很像,包含了一个main函数。main函数接受一个string数组作为输入,函数体调用了println函数。main函数没有返回值,因此它的返回值被声明为Unit。

和Java有点儿不一样的是object这个关键字。这个关键字代表这个类只能有一个实例。这个实例在第一次使用时按需创建。

和Java不一样的还有,main方法没有被static修饰,因为静态的方法和fields在scala中压根不存在。比起声明为静态成员(一个类中只有一份),scala更喜欢声明只有一个实例的类。

scala的一个特点是很容易和java交互,所有java.lang中的类可以默认导入scala.其他包需要显式导入。

 

 

这是一个导入其他包的例子。

导入的语句有点儿不同,同一个包下的类,可以通过大括号来进行批次导入。导入一个包中所有的类,采用_.不采用*,因为*在scala中是一个有意义的符号。

最后一句df format now 类似于df.format(now)

scala秉持的思想是Everything is an Object,不想Java还要特意区分boolean/int为引用类型。

因为Numbers也是object,它们应该有方法。+ - */就是它们的方法。

1 + 2 * 3 / x 类似于 1.+(2.*(3)./(x))

Functions are objects!!!

函数也是scala中的对象。因此可以将function作为参数。这种将函数作为值操作的想法是函数编程的基石之一。

 

 上面就是将函数作为一个参数输入的例子。callback是参数名,() => Unit是参数类型,是一个输入为空,输出为空的函数。

我们还可以对上面的函数进行改进,可以使用匿名函数的功能。

 

 匿名函数是没有名字的函数,=>将匿名函数分为参数表和函数体两部分。

scala中除了object关键字,还有class关键字。

 

 声明class可以带参数的。这好像就是将Java中的构造函数省略,直接将参数加到了class的声明上,函数体中的re,im是两个访问对应变量的方法。

上面的class还可以改变为下面的样子:

 

 改变之后的re,im是根本没有参数的方法,和re(),im()这些空参数的方法是不同的。

scala中的所有class均是继承自一个super-class,可以像Java中那样对super-class中的方法进行重写。

 

 调用直接使用c.toString即可。

case class

case class有如下特点:

1. 创建实例时不需要用new

2. getter函数自动被定义,

3. equals和hashCode这种函数被默认被提供。

4.toString方法也默认被提供。

5. 这些类的实例可以通过模式匹配来分解。就像下面的例子一样,默认创建出来,如果不匹配就删了。

 

现在做一个小任务,做一个计算器,算式中包括+,数,变量。按照往常的习惯必定使用树结构来表示,先声明一个tree,接着声明一个Node.但是如果使用case class来表示的话就不是这种想法了。

 

 接着想一下,变量的值怎么指定呢?可以使用一个string => int的函数来进行转换。

 

 接着等式就可以表示为如下的形式:

 

 这个函数,它首先检查t是不是Sum,如果是将树的左半部分赋值给l,右半部分赋值给r,分别调用eval函数。

如果t不是Sum,然后再判定t是不是Var,如果是将这个Var节点绑定到变量上,

如果两者都不是,t就是一个Const,那么就将在Const节点中的值绑定到变量v上,执行函数右边的部分。

最后如果都不匹配就声明一个错误。

 

 下面是一个例子:

 

 trait相当于Java中的接口。

下面写一个类似于comparable的一个接口:

 

 接下来实现日期间比较的功能:

 

 

 

 scala最后一个特点就是泛型,scala可以定义泛型类。

 

 类Reference参数是一个类型,叫做T

下面是使用泛型类的例子:

 

posted @ 2020-06-19 10:23  随意无心  阅读(305)  评论(0)    收藏  举报