您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > Scala详细总结(精辟版++)
Scala总结--2015-1-1912:33:54本文档针对scala2.10.x,由于scala目前发展迅速,因此可能会和其他版本的不同。===概述scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。scala是纯粹的面向对象的语言。java虽然是面向对象的语言,但是它不是纯粹的,因为java的基本数据类型不是类,并且在java中还有静态成员变量和静态方法。相反,scala是纯粹面向对象的,每个值都是对象,每个操作都是方法调用。scala也是一个成熟的函数式语言。函数式编程有两个指导思想:①函数是头等值,也就是说函数也是值,并且和其他类型(如整数、字符串等)处于同一地位,函数可以被当作参数传递,也可以被当作返回值返回,还可以在函数中定义函数等等;②程序的操作应该把输入值映射为输出值而不是就地修改,也就是说函数调用不应产生副作用,虽然函数式编程语言鼓励使用“无副作用”的方法,但是scala并不强制你必须这么做。scala允许你使用指令式的编程风格,但是随着你对scala的深入了解,你可能会更倾向于一种更为函数式的编程风格。向函数式编程转变,你就应该尽量去使用val、不可变对象、无副作用方法,而不是var、可变对象、有副作用方法。要明白的是,从指令式编程向函数式编程的转变会很困难,因此你要做好充分的准备,并不断的努力。scala运行于JVM之上,并且它可以访问任何的java类库并且与java框架进行互操作,scala也大量重用了java类型和类库。第一个scala程序:objectScalaTest{defmain(args:Array[String]){println(helloscala.)}}===scala解释器安装好scala并配置好PATH环境变量之后,就可以在终端中输入“scala”命令打开scala解释器。在其中,你可以像使用shell一样,使用TAB补全、Ctrl+r搜索、上下方向键切换历史命令等等。退出scala解释器,可以使用命令:“:q”或者“:quit”。由于解释器是输入一句执行一句,因此也常称为REPL。REPL一次只能看到一行代码,因此如果你要在其中粘贴代码段的话,可能会出现问题,这时你可以使用粘贴模式,键入如下语句::paste然后把代码粘贴进去,再按下Ctrl+d,这样REPL就会把代码段当作一个整体来分析。===scala作为脚本运行scala代码也可以作为脚本运行,只要你设置好代码文件的shell前导词(preamble),并将代码文件设置为可执行。如下:#!/usr/bin/envscalaprintln(这是scala脚本)设置代码文件为可执行,即可执行之啦。scala脚本的命令行参数保存在名为args的数组中,你可以使用args获取命令行输入的程序参数。===scala编译运行scala编译器scalac会将scala代码编译为jvm可以运行的字节码,然后就可以在jvm上执行了。假设有一个Hello.scala文件,我们就可以使用scalacHello.scala编译,然后使用scalaHello运行。当然也可以使用java工具来运行,但需要在classpath里指定scala-library.jar。对于classpath,在Unix家族的系统上,类路径的各个项目由冒号“:”分隔,在MSWindows系统上,它们由分号“;”分隔。例如,在linux上你可以输入这样的命令来运行(注意classpath最后加一个“.”):java-classpath/usr/local/scala-2.10.4/lib/scala-library.jar:.Hello===scalaIDE开发环境你可以使用eclipse或者intellijidea作为scala的IDE开发环境,但都需要安装scala插件才行。下面分别介绍这两种方式:eclipse开发环境配置:scalaideforeclipse(下载地址:)中集成了scala插件,你可以直接使用它进行开发,不过它包含的可能不是我们想要的scala版本,因此,还是在该网站上下载对应的scala插件,插在eclipse上,这样更好啊。我们先安装eclipsejuno,然后下载eclipsejuno以及scala2.10.4对应的scalasdk插件升级包:update-site.zip。将插件解压缩,将features和plugins目录下的所有东东都复制到eclipse中的对应目录中,重启eclipse即可。然后就可以新建scalaproject了。intellijidea开发环境配置:我们先安装好intellijidea,然后安装scala插件,自动安装插件有时会非常慢,尤其是在china。我们还是手动配置插件吧。请注意插件的版本,必须与当前idea版本兼容。手动配置插件方法如下:(1)进入settingpluginsbrowserepositorits搜索你要下载的插件名称,右侧可以找到下载地址。(2)解压插件压缩包,把插件的全部文件都复制到IntelliJIDEA安装程序的plugins文件夹中,注意插件最好以一个单独的文件夹放在plugins目录下。(3)一般重启intellijidea就会自动加载插件,进入settingplugins看看有木有。如果不自动加载的话,进入settingpluginsinstallpluginfromdisk,找到刚才复制的插件位置,再然后就好了。接下来就可以新建scalaproject,新建时我选择的是“Scala”(不是sbt,因为我这选择sbt之后,等半天sbt都不会配置好,郁闷啊)。相关姿势:什么是SBT?SBT=(notso)SimpleBuildTool,是scala的构建工具,与java的maven地位相同。其设计宗旨是让简单的项目可以简单的配置,而复杂的项目可以复杂的配置。===scala特点在scala中,语句之后的“;”是可选的,这根据你的喜好。当有多个语句在同一行时,必须加上分号,但不建议把多个语句放在一行。在scala中,建议使用2个空格作为代码缩进,不过我咋喜欢一个tab呢⊙﹏⊙!在scala中,符号“_”相当于java中的通配符“*”。scala类似于c++、java,索引也是从0开始,但元组是个例外,它从1开始。===数据类型scala有7种数值类型:Byte、Char、Short、Int、Long、Float和Double,以及2种非数值类型:Boolean和Unit(只有一个值“()”,相当于java和c++中的void,即空值)。这些类型都是抽象的final类(不能使用new新建,也不能被继承),在scala包中定义,是对java基本数据类型的包装,因此与java基本数据类型有相同的长度。同时,scala还提供了RichInt、RichChar等等,它们分别提供Int、Char等所不具备的便捷方法。另外,scala沿用了java.lang包中的String。在scala中,常量也称作字面量,字符串字面量由双引号包含的字符组成,同时scala提供了另一种定义字符串常量的语法——原始字符串,它以三个双引号作为开始和结束,字符串内部可以包含无论何种任意字符。在scala中,我们使用方法,而不是强制类型转换,来做数值类型之间的转换,如99.44.toInt、97.toChar。另外也可以参见显式类型转换和隐式转换。===变量scala有两种变量:val和var。val如同java中的final变量,var如同java中的非final变量。由于scala是完全面向对象的,因此val和var只是声明了对象的引用是不可变的还是可变的,并不能说明引用指向的对象的可变性。声明变量的同时需要初始化之,否则该变量就是抽象的。如果不指定变量的类型,编译器会从初始化它的表达式中推断出其类型。当然你也可以在必要的时候指定其类型,但注意,在scala中变量或函数的类型总是写在变量或函数的名称的后边。示例如下:valanswer=“yes”valanswer,message:String=“yes”===标识符scala标识符有四种形式:字母数字标识符、操作符标识符、混合标识符、字面量标识符。字母数字标识符:跟其他语言类似,由字母、数字和下划线组成,但需注意“$”字符被保留作为scala编译器产生的标识符之用,你不要随意使用它啊。操作符标识符:由一个或多个操作符字符组成。scala编译器将在内部“粉碎”操作符标识符以转换成合法的内嵌“$”的java标识符。若你想从java代码中访问这个标识符,就应该使用这种内部表示方式。混合标识符:由字母数字以及后面跟着的下划线和一个操作符标识符组成。如unary_+定义了一个前缀操作符“+”。字面量标识符:是用反引号`…`包含的任意字符串,scala将把被包含的字符串作为标识符,即使被包含字符串是scala的关键字。例如:你可以使用Thread.`yield`()来访问java中的方法,即使yield是scala的关键字。===操作符scala的操作符和你在java和C++中的预期效果是一样的,但注意scala并不提供++、--操作符。不过,scala中的操作符实际上都是方法,任何方法都可以当作操作符使用,如a+b相当于a.+(b)。需要注意的是:对于不可变对象(注:对象的不可变并不是说它的引用变量是val的),并不真正支持类似于“+=”这样以“=”结尾的操作符(即方法),不过scala还是提供了一些语法糖,用以解释以“=”结尾的操作符用于不可变对象的情况。假设a是不可变对象的引用,那么在scala中a+=b将被解释为a=a+b,这时就相当于新建一个不可变对象重新赋值给引用a,前提是引用变量a要声明为var的,因为val变量定义之后是不可变的。更多信息参见函数(方法)部分。===块表达式与赋值在scala中,{}块包含一系列表达式,其结果也是一个表达式,块中最后一个表达式的值就是其值。在scala中,赋值语句本身的值是Unit类型的。因此如下语句的值为“()”:{r=r*n;n-=1}正是由于上述原因,scala中不能多重赋值,而java和c++却可以多重赋值。因此,在scala中,如下语句中的x值为“()”:x=y=1===控制结构scala和其他编程语言有一个根本性差异:在scala中,几乎所有构造出来的语法结构都有值。这个特性使得程序结构更加精简。scala内建的控制结构很少,仅有if、while、for、try、match和函数调用等而已。如此之少的理由是,scala从语法层面上支持函数字面量。if表达式:scala的if/else语法结构与java等一样,但是在scala中if/else表达式有值,这个值就是跟在if/esle后边的表达式的值。如下:vals=if(x0)1else-1同时注意:scala的每个表达式都有一个类型,比如上述if/esle表达式的类型是Int。如果是混合类型表达式,则表达式的类型是两个分支类型的公共超类型。String和Int的超类型就是Any。如果一个if语句没有else部分,则当if条件不满足时,表达式结果为Unit。如:if(x0)1就相当于:if(x0)1else()while循环:scala拥有与java和c++中一样的while和do-while循环,while、do-while结果类型是Unit。for表达式:scala中没有类似于for(;;)的for循环,你可以使用如下形式的for循环语句:for(i-表达式)该for表达式语法对于数组和所有集合类均有效。具体介绍如下:枚举:for(i-1to10),其中“i-表达式”语法称之为发生器,该语句是让变量i(注意此处循环变量i是val的(但无需你指定),该变量的类型是集合的元素类型)遍历表达式中的所有值。1to10产生的Ra
本文标题:Scala详细总结(精辟版++)
链接地址:https://www.777doc.com/doc-2857404 .html