Scala(上)

Scala(上)

一,初识Scala

​ Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的各种特性。
在这里插入图片描述

Scala官网给出的6大特性:

  • Java和Scala可以混编 (Scala运行在JVM上,编译后是.class文件)
  • 类型自动推断
  • 并发和分布式 (Actor)
  • Traits特质,特征 (类似于java中的接口和抽象类的结合)
  • 模式匹配 (类似于java的switch)
  • 高阶函数

二,Scala的安装

2.1 在window中安装,配置环境变量

新建 SCALA_HOME,如下图
在这里插入图片描述

配置完SCALA_HOME后,编辑PATH变量,在后面追加

;%SCALA_HOME%\bin

打开window命令行,cmd,输入:scala 查看是否配置成功
在这里插入图片描述

2.2 idea中配置Scala插件

  • 打开idea,close项目后,点击Configure->Plugins
    在这里插入图片描述

  • 搜索Scala,点击install安装
    在这里插入图片描述

  • 创建Scala项目,配置 scala sdk
    在这里插入图片描述

    在这里插入图片描述

  • 弹出选择SDK,点击Browse选择本地安装的Scala目录。选择system.

三,Scala基础语法学习

3.1 数据类型

数据类型和Java中的类似,但比java中多了几种
在这里插入图片描述

通过下图,简单梳理下这些数据类型的关系
在这里插入图片描述

除了上面的之外,还有以下几种特殊的数据类型

  • Null Trait,其唯一实例为null,是AnyRef的子类,不是AnyVal的子类
  • Nothing Trait,所有类型(包括AnyRef和AnyVal)的子类,没有实例
  • None Option的两个字类之一,另一个是Some,用于安全的函数返回值
  • Unit 无返回值的函数的类型,和 Java的 void对应
  • Nil 长度为0的list

3.2 变量和常量的声明

定义变量或者常量的时候,可以写上返回的类型,一般省略,如:val count:Int = 20

常量赋值后,不可再赋值

  /**
 	*定义常量和变量
 	*变量用 var 定义,可修改
 	*常量用 val 定义,不可修改
 	*/
	var name = "zhangsan"
    println(name)
    name ="lisi"
    println(name)
    val gender = "m"
//  gender = "m"   //错误,不能给常量再赋值

3.3 类和对象

  • 创建类
class Person{
    val name = "zs"
    val age = 18
    def sayHello() = {
        println("hello scala")
    }
}
  • 创建对象
Object Scala{
    def main(args:Array[String]): Unit ={
        val p1 = new Person()
        println(p1.name)
        println(p1.sayHello())
    }
}
  • 伴生类和伴生对象
class Person(xname:String,xage:Int){
    var name = Person.name
    val age = xage
    private var gender  = "M"
    
    def this(name:String,age:Int,g:String){
        //重写构造器,得先调用默认的构造器
        this(name,age)
        gender = g
    }
    
    def sayName()= {
        "my name is "+name
    }
}

Object Person{
    private val name = "zzs"
    def main(args:Array[String]): Unit ={
        val p2 = new Person()
        println(p2.age)
        println(p2.sayName)
        println(p2.gender)
    }
}

3.4 Scala语法总结点

  • 一行结束,不需要分号。如果一行里有多个语句,则之间可以用分号隔开
  • var修饰变量,val修饰常量
  • Object可以理解为是单例,相当于java的工具类,它里面的方法都是static静态的
  • Object不可以传参,class可以参数,相当于默认的构造器
  • 重写构造器,一定得先调用默认的构造器
  • class自动实现了getter,setter方法
  • 使用Object时,不用new, new对象(class)时,除了class里的方法不执行,其余的都执行
  • 在同一个Scala文件中,class和Object名字相同,则他们互为伴生类和伴生对象,它们可以直接访问对方的私有属性

3.5 if else

var age =20 
if (age>10){
    println("-----")
}else {
    println("======")
}

3.6 for while do…while

  • to 和 until 的用法 (不带步长,带步长的区别)
	/**
     * to和until
     * 例:
     * 1 to 10 返回1到10的Range数组,包含10
     * 1 until 10 返回1到10 Range数组 ,不包含10
     */
    
    println(1 to 10 )//打印 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    println(1.to(10))//与上面等价,打印 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    
    println(1 to (10 ,2))//步长为2,从1开始打印 ,1,3,5,7,9
    println(1.to(10, 2)) 
    
    println(1 until 10 ) //不包含最后一个数,打印 1,2,3,4,5,6,7,8,9
    println(1.until(10))//与上面等价
    
	println(1 until (10 ,3 ))//步长为3,从1开始打印,打印1,4,7
  • 创建for循环
for (i<- 1 to 10){
    println(i)
}
  • 创建多层for循环
	//可以分号隔开,写入多个list赋值的变量,构成多层for循环
    //scala中 不能写count++ count-- 只能写count+=
    var count = 0;
    for(i <- 1 to 10; j <- 1 until 10){
      println("i="+ i +",	j="+j)
      count += 1
    }
    println(count);
  • 打印九九乘法表
for(i <- 1 until 10 ;j <- 1 until 10){
    if(i>=j){
    	print(i +" * " + j + " = "+ i*j+"	")
        
     }
    if(i==j ){
        println()
     }
      
}
  • for循环中可以加条件判断,分号隔开
for(i<- 1 to 10 ;if (i%2) == 0 ;if (i == 4) ){
      println(i)
}
  • while do…while
 //将for中的符合条件的元素通过yield关键字返回成一个集合
    val list = for(i <- 1 to 10  ; if(i > 5 )) yield i 
    for( w <- list ){
      println(w)
	}

	/**
     * while 循环
     */
    var index = 0 
    while(index < 100 ){
    	println("第"+index+"次while 循环")
      index += 1 
    }

	index = 0 
    do{
    	index +=1 
    	println("第"+index+"次do while 循环")
	}while(index <100 )

四,Scala函数

4.1 Scala函数的定义

  • 有参函数
  • 无参函数
def fun(a:Int,b:Int): Unit = {
    println(a+b)
}
fun(5,10)

def fun01(a:Int,b:Int) = {
    a+b
}
println(fun01(5,10))

注意点:

  • 可以定义传入的参数,要指定传入参数的类型
  • 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写。比如在递归函数中或者函数的返回值是函数类型的时候
  • scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回值类型
  • 如果返回值可以一行搞定,可以将{}省略
  • 传递给方法的参数可以在方法中使用,并且Scala规定方法传过来的参数为val,不是var
  • 如果去掉方法体前面的等号,那么这个方法返回类型必须是Unit的。这种说法无法方法体里面什么逻辑都成立,Scala可以把任意类型转换为Unit。假设,里面的逻辑最后返回了一个String,那么这个返回值会被转换为Unit,并且值会被丢弃。

4.2 递归函数

def fun(a:Int) = {
    if (a==1)
    	1
    else
    	a*fun(a-1)
}
println(fun(5))

4.3 包含参数默认值的函数

  • 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值
  • 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称
def fun2(a:Int=10,b:Int) = {
    println(a+b)
}
fun2(b=5)

4.4 可变参数个数的函数

  • 多个参数用逗号分开
def fun3(a:Int*) = {
    var sum = 0
    for(i<- a){
        sum+=i
    }
    sum
}
println(fun3(2,3,4))

4.5 匿名函数

  • 有参匿名函数
  • 无参匿名函数
  • 有返回值的匿名函数

注意:可以将匿名函数返回给val定义的值 匿名函数不能显式声明函数的返回类型

val fun4 = (a:Int)=>{println(a)}  ##有参数的匿名函数
val fun5 = ()=>{println("无参匿名函数.....")}  ##无参的匿名函数
val fun6 = (a:Int,b:Int)=> {a+b}   ##有返回值的匿名函数

4.6 嵌套函数

def fun7(num:Int) = {
    def fun8(num1:Int,num2:Int) = {
        num1+num2
    }
    fun8(num,10)
}
println(fun7(10))

4.7 偏应用函数

偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分参数,或不需要提供所需的参数

def log(date Date,s:String) = {
    println("date is "+date+" log is "+s)
}

val date = new Date()
val logWithlog = log(date,_:String)
logWithlog("xixi") //等同于  log(date,"xixi")
logWithlog("hehe")
logWithlog("heihei")

4.8 高阶函数

函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和返回类型都是函数

//函数的参数是函数
def fun02(a:Int,f:(Int)=>Int) = {
    a+f(100)
}
def f(b:Int) = {
    b+10
}
println(fun02(10,f))

//函数的返回值是函数
def fun03(a:Int,b:Int):(Int)=>Int ={
    def f2(c:Int) = {
        a+b+c
    }
    f2
}
println(fun03(5,3)(1))

//函数的参数和返回值是函数
def fun04(a:Int,f:(Int)=> Int):(Int)=>Int ={
    def f04(c:Int) = {
        a+f(10)-c
    }
    f04
}
def f5(b:Int) = {
    b*2
}
println(fun04(6,f5)(10))  

4.9 柯里化函数

  • 可以理解为高阶函数的简化
def fun7(a:Int,b:Int)(c:Int,d:Int) = {
    a+b+c+d
}
println(fun7(1,2)(3,4))

五,Scala字符串

  • String
  • StringBuilder 可变
  • String 操作方法举例
val s = "abcd"
val s1 = "ABCD"

println(s.indexof(97))  ##如果字符串中有传入的assci码对应的值,返回下标
println(s.indexof("d"))  

println(s==s1)
println(s.equals(s1))
println(s.equalsIgnoreCase(s1)) ##比较忽略大小写

/**
 * compareToIgnoreCase
 * 
 * 如果参数字符串等于此字符串,则返回值 0;
 * 如果此字符串小于字符串参数,则返回一个小于 0 的值;
 * 如果此字符串大于字符串参数,则返回一个大于 0 的值。
 * 
*/
 println(str.compareToIgnoreCase(str1))

 
 val str = new StringBuilder()
 str.append("abc")
 str.append("d")
 str+'e'     ##追加
 str++='fg'  ##追加
 println(str)

String常用方法:

char charAt(int index)
返回指定位置的字符  从0开始
	
int compareTo(Object o)
比较字符串与对象
	
int compareTo(String anotherString)
按字典顺序比较两个字符串
	
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写
	
String concat(String str)
将指定字符串连接到此字符串的结尾
	
boolean contentEquals(StringBuffer sb)
将此字符串与指定的 StringBuffer 比较。
	
static String copyValueOf(char[] data)
返回指定数组中表示该字符序列的 String
	
static String copyValueOf(char[] data, int offset, int count)
返回指定数组中表示该字符序列的 String
	
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束
	
boolean equals(Object anObject)
将此字符串与指定的对象比较
	
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写
	
byte getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
	
byte[] getBytes(String charsetName
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
	
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此字符串复制到目标字符数组
	
int hashCode()
返回此字符串的哈希码
16	
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引(输入的是ascii码值)
	
int indexOf(int ch, int fromIndex)
返返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索
	
int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引
	
int indexOf(String str, int fromIndex)
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
	
String intern()
返回字符串对象的规范化表示形式
	
int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引
	
int lastIndexOf(int ch, int fromIndex)
返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索
	
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右边出现处的索引
	
int lastIndexOf(String str, int fromIndex)
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
	
int length()
返回此字符串的长度
	
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式
	
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等
28	
boolean regionMatches(int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等
	
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
	
String replaceAll(String regex, String replacement
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
	
String replaceFirst(String regex, String replacement)
使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
	
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串
	
String[] split(String regex, int limit)
根据匹配给定的正则表达式来拆分此字符串
	
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始
	
boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
	
CharSequence subSequence(int beginIndex, int endIndex)
返回一个新的字符序列,它是此序列的一个子序列
	
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串
	
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串
	
char[] toCharArray()
将此字符串转换为一个新的字符数组
	
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写
	
String toLowerCase(Locale locale)
使用给定 Locale 的规则将此 String 中的所有字符都转换为小写
	
String toString()
返回此对象本身(它已经是一个字符串!)
	
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写
	
String toUpperCase(Locale locale)
使用给定 Locale 的规则将此 String 中的所有字符都转换为大写
	
String trim()
删除指定字符串的首尾空白符
	
static String valueOf(primitive data type x)
返回指定类型参数的字符串表示形式

猜你喜欢

转载自blog.csdn.net/weixin_43270493/article/details/87392871
今日推荐