本文主要介绍Scala入门教程的详细讲解,通过示例代码非常详细,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
Scala简介
Scala(Scala Language的缩写)是一种通用编程语言,可以运行在JVM和。Net平台。它既可以用于大型应用程序开发,也可以用于脚本编程。它是由马丁奥德斯克在2001年开发的。自2004年以来,该程序一直运行在JVM和。Net平台,并因其简洁、优雅、类型安全的编程模式而备受关注。
Scala语言具有如下特点:
1 纯面向对象编程语言
(1)封装/信息隐藏。
(2)继承。
(3)多态性/动态绑定。
(4)所有预定义的类型都是对象。
(5)所有操作都是通过向对象发送消息来执行的。
(6)所有用户定义的类型都是对象。
2函数式编程语言
定义:函数式编程是一种编程悖论,将计算视为对数学函数和可避免数据的求值。
函数式编程语言应该支持以下特性:
(1)高阶函数
(2)关闭
(3)模式匹配
(4)单一转让
(5)懒评
(6)类型推断。
(7)尾部调用优化
(8)类型推理
3 Scala语言具有很强的兼容性、移植性
Scala运行在JVM上,可以与JAVA互操作,具有和JAVA一样的平台可移植性。
Scala示例
/**
*
* scala是一种多范式编程语言,集成了面向对象编程、函数式编程等诸多特性。
* scala运行在虚拟机上,兼容现有的Java程序。
* Scala源代码编译成java字节码,所以运行在JVM上,可以调用现有的Java类库。
*/
/**
*第一个Scala程序
Scala和Java最大的区别在于分号(;)可选!
*编译并运行:
*先编译:scalac HelloScala.scala会生成两个文件:HelloScala$。class和HelloScala.class
*运行:scala HelloScala
*输出结果:你好scala!
*
*对象HelloScala{
def main(args:Array[String]):Unit={
println(‘你好scala!')
}
}
*/
/**
* Scala基本语法:
*区分大小写
*类名大写(MyFirstScalaClass)
*方法名的第一个字母是小写的(myMethodName())
*程序文件名应该与对象名完全匹配。
* def main(args:array[string]):Scala程序是从main方法开始处理的,程序的入口。
*
* Scala注:分为多行/* */和单行//
*
*换行符:Scala是面向行的语言,语句可以用分号(;)结束或换行(println())
*
*有两种方法来定义包:
* 1、package com.ahu
HelloScala级
* 2、包com.ahu{
HelloScala级
* }
*
*报价:导入java.awt.Color
*如果你想在包中引入几个成员,你可以使用选择器:
*导入java.awt.{Color,Font}
*//重命名成员
*导入Java . util . { HashMap=JavaHashMap }
*//隐藏成员默认情况下,scala总是引入java.lang._,scala。_和Predef。_,所以Scala。使用时省略。
*导入java.util. {HashMap=_,_ }//util包的所有成员都被引入,但是HashMap被隐藏。
*/
/**
* Scala数据类型:
* Scala的数据类型和Java一样。下面是Scala拥有的一些数据类型。
*单位:表示无值,与其他语言的void相同。
* Null:null或空引用。
* Nothing:是Scala的类层次结构的最低级别,是任何其他类型的子类型。
* Any:是所有其他类的超类。
* AnyRef:是Scala中所有引用类的基类。
*
*多行字符串的表示:
val foo=' ' '的第一行
预备之物
第三行'''
*/
/**
* Scala变量:
*在Scala中,用关键字“var”声明变量,用关键字“val”声明常量。
* var myVar1 : String='foo '
* var myVar2 : Int
* val myVal='你好,Scala!'
* Scala多变量声明:
* valxmax,ymax=100//xmax和ymax都声明为100。
*/
/**
* Scala访问修饰符:
* Scala访问修饰符基本和Java一样,分别是private、protected和public。
*默认情况下,Scala对象的访问级别是public。
*
*私有成员:用private关键字修饰的成员只在包含成员定义的类或对象中可见。
*外部类{
*类内部{
* private def f(){println('f')}
*最里面的类{
* f() //正确
* }
*(新内部)。f() //错误
* }
* }
*
*保护成员:Scala比Java更严格。在定义成员的类的子类中,只允许访问受保护的成员。
*包装p{
*特级
*受保护的def f() {println('f')}
* }
* class Sub扩展Super{
* f()
* }
*其他类别{
*(新超级)。f() //错误
* }
* }
*
* public member:默认情况下是public,这样的成员可以在任何地方访问。
*外部类{
*类内部{
* def f(){println('f')}
*最里面的类{
* f() //正确
* }
* }
*(新内部)。f() //正确
* }
*
*范围保护:在Scala中,可以通过使用限定符来强调访问修饰符。
*私有[x]或受保护[x]
* private[x]:除了[.]或包中的类[.]和它们的伴随对象。
*/
/**
* Scala运算符:和Java一样,我不会在这里浪费时间一一介绍。
*算术运算符、关系运算符、逻辑运算符、按位运算符、赋值运算符。
*/
/**
* Scala if.else语句:就像Java一样,简单列举四种情况。
*如果(.){
*
* }
*
*如果(.){
*
* }否则{
*
* }
*
*如果(.){
*
* }否则如果(.){
*
* }否则{
*
* }
*
*如果(.){
*如果(.){
*
* }
* }
*/
/**
* Scala循环:和Java一样,这里不赘述,只介绍三种循环类型。
* while循环,do.while循环,for循环
*/
/**
* Scala函数:用一个例子来说明函数的定义和调用。
*对象测试{
* def main(args: Array[String]){
* println(addInt(1,3));//函数调用
* }
* defauddint(a:int,b:int):int={//函数定义
* var sum:Int=0
*总和=a b
*返回总和
* }
* }
*/
/**
* Scala闭包:
*闭包是一个函数,它的返回值依赖于在函数外部声明的一个或多个变量。
*示例:
*对象测试{
* def main(args: Array[String]){
* println(' Muli plier(1)value=' Muli plier(1))
* println(' Muli plier(2)value=' Muli plier(2))
* }
* var factor=3 //在函数外定义的自由变量
* Val Muli plier=(I:int)=I * factor//Muli plier函数变量是一个闭包
* }
*输出结果:
* multiplier(1)值=3
* multiplier(2)值=6
*/
/**
* Scala字符串:
*
* Scala中可以创建两种字符串:一种不能修改,另一种可以修改。
*//创建不可修改的字符串
* val问候语:String='Hello World!';
*//创建可以修改的字符串
*对象测试{
* def main(args: Array[String]){
* val buf=new StringBuilder
* buf='a' //添加一个字符
* buf='bcdef' //添加一个字符串
* println(buf . tostring);//输出:abcdef
* }
* }
*
*字符串长度:xxx.length()
*
*字符串连接:可以使用concat()方法或加号。
*对象测试{
def main(args: Array[String]) {
var str 1=' String 1:';
Var str2=' string 2
var str 3=' String 3:';
Var str4=' string 4
println(str 1 str 2);//字符串1:字符串2
println(str 3 . concat(str 4));//字符串3:字符串4
}
}
*
*创建格式化字符串:
printf()方法可以在string类中用来格式化字符串并输出。
*对象测试{
* def main(args:Array[String]){
* var floatVar=12.456
* var intVar=2000
* var stringVar='字符串变量'
* var fs=printf('浮点变量是'
* " % f,整数变量是%d,字符串是'
* '%s ',floatVar,intVar,stringVar)
* println(fs) //浮点变量为12.456000,整数变量为2000,字符串为字符串变量。
* }
* }
*/
/**
* Scala数组:
* 1.声明一个数组
* var z:Array[String]=new Array[String](3)或var z=new Array[String]()
* z(0)=' value 1 ';z(1)=' value 2 ';z(2)='值3 '
*
* var z=Array('值1 ','值2 ','值3 ')
*
* 2.处理数组
*对象测试{
* def main(args: Array[String]){
* var myList=Array(1.1,2.2,3.3,4.4)
*
*//输出所有数组元素
* for(x - myList){
* println(x)
* }
*
*//计算数组中所有元素的总和
* var total=0.0
* for(i - 0到(myList.length - 1)){
* total=myList(i)
* }
* println ('sum:'总计')
*
*//查找数组中最大的元素
* var max=myList(0)
* for(i - 1到(myList.length - 1)){
* if(我的列表(i) max)
* max=myList(i)
* }
* println ('max:' max ')
* }
* }
*
* 3.多维数组
*导入数组。_
*对象测试{
* def main(args: Array[String]){
*//定义一个数组
* var myMatrix=ofDim[Int](3,3)
*//创建矩阵
*对于(i - 0到2){
*对于(j - 0到2){
* my matrix(I)(j)=j;
* }
* }
*//打印矩阵
*对于(i - 0到2){
*对于(j - 0到2){
* print(' my matrix(I)(j));
* }
* println();
* }
* }
* }
*
* 4.合并数组
*导入数组。_
*对象测试{
* def main(args: Array[String]){
* var myList1=Array(1.1,2.2,3.3,4.4)
* var myList2=Array(5.5,6.6,7.7,8.8)
*//与concat()合并
* var myList3=concat(myList1,myList2)
*//输出所有数组元素
*对于(x - myList3){
* println(x)
* }
* }
* }
*
* 5.创建区间数组:使用range(x,y,z)创建区间数组。数值范围大于或等于x且小于y。Z代表步长,默认情况下为1。
*对象测试{
* def main(args: Array[String]){
* var myList1=范围(10,20,2)
* var myList2=range(10,20)
*对于(x - myList1){
* print(' x)//Output:10 12 14 16 18
* }
* println()
*对于(x - myList2){
* print(' x)//Output:10 11 12 13 14 15 16 17 18 19
* }
* }
* }
*/
/**
* Scala集合:分为可变集合和不可变集合。
*可变集合:可以在适当的地方更新或扩展,即可以修改、添加或删除集合的元素。
*不可变集:永远不会变。但是可以模拟添加、移除和更新操作,但是这些操作将在每种情况下返回新的集合,
*同时,使原始设置不变。
*//定义整形列表
* val x=List(1,2,3,4)
*//定义集合
* var x=Set(1,3,5,7)
*//定义地图
* val x=Map('一'- 1,'二'- 2,'三'- 3)
*//创建两个不同类型的元组
* val x=(10,' Runoob ')
*//定义选项
* val x:Option[Int]=Some(5)
*/
/**
* Scala迭代器:
* Iterator不是一个集合,而是一个用来访问集合的方法。
*
*/
/*对象测试{
def main(args:Array[String]):Unit={
val it=迭代器('一','二','三','四')
While(it.hasNext){ //检查集合中是否还有其他元素。
Println(it.next()) //返回迭代器的下一个元素,并更新迭代器的状态。
}
val ita=迭代器(1,2,3,4,5)
val itb=迭代器(11,22,33,44,55)
//println(ita.max) //查找最大的元素
//println(itb.min) //查找最小的元素
Println(ita.size) //获取迭代器的长度
Println(itb.length) //获取迭代器的长度
}
}*/
/**
* Scala类和对象:
*类是对象的抽象,对象是类的具体实例。
*类是抽象的,不占用内存;对象是一个类的具体实例,它占用存储空间。
*
*/
/*导入Java . io。_
类点(xc: Int,yc: Int){
var x: Int=xc
var y: Int=yc
def move(dx: Int,dy: Int): Unit={
x=x dx
y=y dy
println(' x点的坐标是:' x ')
println(y点的坐标为:“y”)
}
}
对象测试{
def main(args:Array[String]):Unit={
val pt=新点(10,20)
//移动到新位置
点移动(10,10)
}
}*/
/**
* Scala继承:类似Java。
* 1.override修饰符必须用于重写非抽象方法。
* 2.只有主构造函数可以将参数写入基类的构造函数。
* 3.在子类中重写超类的抽象方法时,不需要重写。
*/
/*类点(val xc: Int,val yc: Int){
var x: Int=xc
var y: Int=yc
def move(dx: Int,dy: Int): Unit={
x=x dx
y=y dy
println(' x点的坐标是:' x ')
println(y点的坐标为:“y”)
}
//-
var name=' '
重写def toString=get class . getname '[name=' name ']'
}
类位置(覆盖val xc: Int,覆盖val yc: Int,
Valzc: int) ExtendsPoint (XC,YC){//继承父类的字段。
var z: Int=zc
def move(dx: Int,dy: Int,dz: Int){
x=x dx
y=y dy
z=z dz
println(' x点的坐标是:' x ')
println(y点的坐标为:“y”)
println(' z点的坐标是:' z ')
}
//-
var薪金=0.0
override def toString=super . toString '[salary=' salary ']'
}
对象测试{
def main(args:Array[String]):Unit={
val loc=新位置(10,20,30)
位置移动(10,10,5)
//-
loc.name='lc '
loc.salary=35000.0
println(位置)
}
}*/
/**
* Scala单例对象:
* Scala中没有静态。你应该使用object关键字来实现单例模式。
*在Scala中使用singleton模式时,除了定义一个类,还应该定义一个同名的object对象。它和类的区别是Object对象不能带参数。
*当一个单例对象与一个类共享一个名称时,它被称为该类的伴随对象。
*类及其伴随对象必须在同一个源文件中定义。
*一个类和它的伴随对象可以互相访问它的私有成员。
*/
/*//私有构造方法
类标记private(val color:String) {
Println('创建' this)
override def toString():String=' color mark:' color//4:color mark:red
}
//与类共享名称的companion对象可以访问该类的私有属性和方法。
对象标记{
私有值标记:Map[String,Marker]=Map(
' Red '-新标记(' red '),//1:创建颜色标记:红色
' Blue '-新标记(' blue '),//2:创建颜色标记:蓝色
' green '-新标记(' green') //3:创建颜色标记:绿色
)
定义应用(颜色:字符串)={
if(markers . contains(color))markers(color)else null
}
def getMarker(color:String)={
if(markers . contains(color))markers(color)else null//5:颜色标记:蓝色
}
def main(args: Array[String]) {
println(标记('红色'))
//单实例函数调用,省略。(点)符号
println(Marker getMarker 'blue ')
}
}*/
/**
* Scala Trait(特性):
*相当于Java的接口,但比接口更强大。它还可以定义属性和方法的实现。
*一般情况下,Scala的类只能单一继承,但特性可以实现多重继承。
*/
/*//定义特征
特质相等{
Isequal (x: any):布尔//未实现的方法
def isNotEqual(x: Any): Boolean=!IsEqual(x) //实现的方法
}
类点(xc: Int,yc: Int)延伸相等{
var x: Int=xc
var y: Int=yc
override def is equal(obj:Any):Boolean=
[点]的实例
作为[点]的实例。x==x
}
对象测试{
def main(args:Array[String]):Unit={
值p1=新点(2,3)
值p2=新点(2,4)
值p3=新点(3,3)
println(p1.isNotEqual(p2))
println(p1.isNotEqual(p3))
println(p1.isNotEqual(2))
}
}*/
/**
*特征构建顺序:
*构造函数的执行顺序:
* 1.调用超类的构造函数。
* 2.功能构造函数在超类构造函数之后、类构造函数之前执行。
* 3.要素是从左到右构造的。
* 4.在每个特征中,首先构建父特征。
* 5.如果多个特征共享一个父特征,则不会重复构建该父特征。
* 6.所有的特征都被构造,子类也被构造。
*/
/**
* Scala模式匹配:
* 选择器匹配{备选项}
*/
/*对象测试{
def main(args:Array[String]):Unit={
println(matchTest('two '))
println(matchTest('test '))
println(matchTest(1))
println(matchTest(6))
}
定义匹配测试(x:任何):任何=x匹配{
案例1='一'
案例二=2
案例y: Int='scala .Int' //对应类型匹配
case _='many' //默认全匹配选项
}
}*/
/**
* 使用样例类:
* 使用情况关键字的类定义就是样例类,样例类是种特殊的类,经过优化以用于模式匹配。
*/
/*对象测试{
def main(args:Array[String]):Unit={
val alice=新人("爱丽丝",25岁)
值bob=新人(“鲍勃”,32岁)
瓦尔查理=新人("查理",27岁)
对于(人员列表(爱丽丝、鲍勃、查理)){
人员匹配{
案例人物('爱丽丝,25)=println('嗨爱丽丝!')
案例人物('鲍勃,32)=println('你好鲍勃!')
案例人(姓名,年龄)=println('年龄: '年龄'年份,姓名: '姓名'?')
}
}
}
//样例类
案例类人员(姓名:字符串,年龄:整数)
}*/
/**
* Scala正则表达式:
* 和Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)差不多,在用的时候查一下就行了。
*/
/**
* Scala异常处理:
* 和Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)类似。在斯卡拉中借用了模式匹配的方法来在捕捉语句块中来进行异常匹配。
*/
/*导入java.io.{FileNotFoundException,FileReader,IOException}
对象测试{
def main(args:Array[String]):Unit={
尝试{
值f=新文件阅读器(' input.txt ')
}接住{
案例示例:FileNotFoundException={
println(“丢失文件异常")
}
案例示例:IOException={
println("IO异常")
}
}最后{
println('最终退出.')
}
}
}*/
/**
* Scala提取器(提取器):
*应用方法:无需新的操作就可创建对象。
*取消应用方法:是应用方法的反向操作,接受一个对象,然后从对象中提取值,提取的值通常是用来构造对象的值。
*/
/*对象测试{
def main(args: Array[String]) {
println('应用方法:' apply('Zara ',' Gmail。com’);//也可直接测试(“Zara”、“gmail.com”)来创建Zara@gmail.com
println('取消应用方法:' unapply(' Zara @ Gmail。com’);
println('取消应用方法:' unapply(' Zara Ali ');
}
//注入方法(可选)
定义应用(用户:字符串,域:字符串)={
用户"@"域
}
//提取方法(必选)
def unapply(str:String):Option[(String,String)]={
val零件=字符串拆分' @ '
if (parts.length==2){
一些(零件(0),零件(1))
}否则{
没有人
}
}
}*/
/**
* 提取器使用模式匹配:
* 在我们实例化一个类的时,可以带上0个或者多个的参数,编译器在实例化的时会调用应用方法。
*/
/*对象测试{
def main(args: Array[String]) {
值x=测试(5)
打印目录(十)
x匹配
{
案例测试(数量)=println(x '是数字的两倍!') //2:10是5的两倍!
//取消应用被调用
case _=println('无法计算)
}
}
def apply(x: Int)=x*2 //1:10
def unapply(z:Int):Option[Int]=if(z % 2==0)Some(z/2)else None
}*/
/**
* Scala文件输入/输出:
*
*/
/*//文件写操作
导入java.io._
对象测试{
def main(args: Array[String]) {
val writer=新的PrintWriter(新文件(' test.txt '))
writer.write('Scala语言)
writer.close()
}
}*/
//从屏幕上读取用户输入
/*对象测试{
def main(args: Array[String]) {
打印('请输入菜鸟教程官网: ' )
val line=Console.readLine //在控制台手动输入
println('谢谢,你输入的是: '行)
}
}*/
//从文件上读取内容
/*导入scala.io.Source
对象测试{
def main(args: Array[String]) {
println('文件内容为:' )
Source.fromFile('test.txt ').foreach{
打印
}
}
}*/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。