新手入门Scala!!!入门讲解Scala,Scala语法讲解一【小二讲堂】

版权声明:本文为博主原创文章,转载请注明出处!!!小二学堂:https://blog.csdn.net/Mirror_w https://blog.csdn.net/Mirror_w/article/details/89348834

本篇博文是小二针对工作中有帮助的初学者精心总结!!!
小二大讲堂推荐:Pyhton入门讲解

一、scala简介

什么是scala
Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。
在很多地方Scala都很像Java,但是比Java更为函数式编程,这句话主要从三句话就可以理解“一切都是对象”,“一切都是函数”以及“一切都是表达式”三方面理解。

首先是一切都是对象,这大概和Python很像,因为即便是数字1都有一系列的方法,所以我们可以调用1.toDouble将Int类型的1转换为Double类型的1。

然后是一切都是函数,表现为可以重载操作符,Python很像,在一定程度上我总觉的Scala是Java和Python生的孩子,只不过遗传基因比较大的卵子是Java提供的,而比较小的那颗精子则是Python提供的。
最后是一切都是表达式,if(){}else{}这样的语句块是有返回值的。

二、Scala六大特性

在这里插入图片描述

1.seamless java interop

和java语言是无缝整合运行在JVM上的
可以与java进行方法的互相调用

2.type inference 类型的自动推断

var 定义变量
val 定义常量
在这里插入图片描述

3.concurrency& distribution 并行和分布式

底层有一个actor通信模型,解决了死锁的问题,底层利用队列的方式,解决节点之间的集群

4、traits特质和特性

将java中个接口、抽象类等进行整合

5.pattern matching 模式匹配

类似java中的switch…case…scala关键字:match匹配

6.higher-order functioins 高阶函数

体现scala面向函数的特性的一种方式,“一切皆函数”

Scala语言的注意事项:

-建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法。
-scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。object不可以传参数。另:Trait不可以传参数
-scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。
重写构造函数的时候,必须要调用默认的构造函数。
-class 类属性自带getter ,setter方法。
-使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行,其他都执行。
-如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。

三、scala中语法介绍以及六大特性

-scala中定义常量使用val,常量不可变,定义变量用var,变量可变,在定义常量和变量是会有类型自动推断机制。
-scala中每行有自动的分号推断机制,不需要在每行结束时进行写封号
尽量使用val常量定义,因为JVM的GC更容易回收
-Object和clas类的区别
Scall中有calss和Object,定义class是可以传参,但是参数传递的时候一定要指定参数类型
-Scala中的object相当于java中的单例,类似于java中的工具类,object中定义的所有属性和方法都是静态的。
注意:scala中定义类和object的作用是将静态的与非静态的相剥离
在这里插入图片描述

1.创建类和对象

–类中常量的定义–建议 var
–类中变量的定义–val
-类中对象的创建,对象不可以传递参数了,但是传递参数时
只是自动找apply方法。使用object对象时不能使用类
–创建类,类的创建时可以传递参数,但是必须要指定数据类型
代码演示:

*
  1.常量和变量的定义
  2.对象参数的传递
 */
class Person(xname:String,xage:Int){

  val name=xname
  val age=xage
  var sex='f'
  def this(xname:String,xage:Int,xsex:Char){
    this(xname,xage)
    this.sex=xsex
  }
  def fun1(): Unit ={
    print(s"name is ${xname} ,age is ${xage} ,sex is ${sex}")
  }
}

object ScalaDemo01 {

  /**
    * object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法。
    *
    */
  def main(args: Array[String]): Unit = {

    val person=new Person("zhangsan",18,'f')
//    person.fun1()
   ScalaDemo01("lulu")
  }
  def apply(name:String)={
    print(s"name is $name")
  }
}

2、伴生类和伴生对象

类和对象具有相同的名称
/*
伴生类和伴生对象:
类名和对象名是相同的名称
*/

class Student{

  def showMsg(name:String): Unit ={
    print(s"the student`s name is $name")
  }
}
object Student{

  def main(args: Array[String]): Unit = {
      //创建伴生对象
    var stu=new Student();
    stu.showMsg("zhangsan")
  }
}

3…条件判断以及循环语句
条件判断

var age=19
if(age<18){
  print(s"she is $age year old")
}else{
  print(s"she is a man")
}
for循环 包括1-10左右都是闭区间
for (i<-1 to 10){
  println(i)
}


until:不包括右侧的10,左开右闭
for (i<- 1 until 10){
  println(i)
}

打印偶数

for(i<-1 to 10 ;if(i%2==0)){
  println(i)
}

利用嵌套for循环打印九九乘法表

for (i<- 1 to 9){
    for (j<- 1 until 10){
      if(i>=j){
        print(s"$j * $i = ${i*j}\t")
      }
      if(i==j){
        println()
      }
    }
}

将两层循环进行整合

for (i<- 1 to 9;j<- 1 until 10){
    if(i>=j){
      print(s"$j * $i = ${i*j}\t")
    }
    if(i==j){
      println()
  }
}
  • scala中不能使用count++,count—只能使用count = count+1 ,count += 1
    var count=0
    var sum=0
    while(count<100){
      sum+=count
      count+=1
    }
    print(sum)
  • for循环用yield 关键字返回一个集合
    //返回一个Vector数组集合
    var arr=for(i<- 1 until 100;if(i>50)) yield  i
    print(arr)
    for (n<-arr)
      println(n)
  • while循环,while(){},do {}while()
     /**
         * while 循环
         */
        var index = 0 
        while(index < 100 ){
         println("第"+index+"次while 循环")
          index += 1 
        }
        index = 0 
        do{
         index +=1 
         println("第"+index+"次do while 循环")
    }while(index <100 )

4、Scala方法与函数

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

  • 1.scala的有参方法和无参方法
//定义无参方法
def fun1(): Unit ={
  print("无参方法")
}
//有参方法
def fun2(name:String,age:Int): Unit ={
  print(s"${name} is ${age} year old")
}
  • 2.递归方法
//递归方法
def diGui(num:Int) :Int ={
  if(num==1)
    num
  num*diGui(num-1)
}
  • 3.参数有默认值的方法
    -如果参数有默认值,如果方法调用的时候没有传递参数,则就是默认的参数,如果传递了参数就是传递的,新值会覆盖默认值
    l 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
    如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称

     def fun3(a :Int = 10,b:Int) = {
       println(a+b)
     }
     fun3(b=2)
    
    
  • 4.可变参数的方法

def main(args: Array[String]): Unit = {
  fun(1,2,3,4,5,6,7,8,9)
}

//可变参数的方法
def fun(num:Int*)={
  var sum=0
  for(n<-num){
    sum+=n
  }
  print(sum)
}
  • 5.匿名函数
    1). 有参匿名函数
//匿名函数
  var fun= (name:String)=>{
    print(s"有参匿名函数 $name")
  }
  //函数调用
  fun("匿名函数")
}
  • 2.) 无参匿名函数
//匿名函数
var fun= ()=>{
  print("无参匿名函数")
}
//函数调用
fun()
  • 3). 有返回值的匿名函数
//有返回值的匿名函数
var fun= (a:Int,b:Int)=>{
  a+b
}
//函数调用
print(fun(1,2))

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

  • 6.嵌套方法
def main(args: Array[String]): Unit = {
 print(fun1(1))
}
def fun1(num:Int)={
  def fun2(a:Int,b:Int): Int ={
    a+b
  }
  fun2(num,2)
}
  • 7、偏应用函数
  def main(args: Array[String]): Unit = {
    var date =new Date();
    log(date,"log1")
    log(date,"log2")
    log(date,"log3")
  }
//偏应用函数
  def log(date:Date,s:String)={
    println(s"date is $date ,log is $s")
  }
  • 8、高阶函数

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

def main(args: Array[String]): Unit = {
    println(highFun(fun1,1))
  }

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

l 函数的返回是函数

def main(args: Array[String]): Unit = {
    println(highFun(1,2)(3,"math"));
  }

//函数的参数是函数

def highFun(a:Int,b:Int):(Int,String)=>String ={
  val s=a+b
  def fun(s:Int,v2:String)={
      s"the $v2 is "+s
  }
  fun
}

l 函数的参数和函数的返回是函数
def main(args: Array[String]): Unit = {
 println(highFun(fun,"lisi")(2,10))
}
//函数的参数和函数的返回是函数
def highFun(f:(Int,Int)=>String,name:String) :(Int,Int)=>String={
     fun
}

def fun(a:Int,b:Int):String={
 "the student "+a*b
}

8、柯里化函数
高阶函数的简化

def main(args: Array[String]): Unit = {
  println(fun(1,2)(3,4))
}
def fun(a:Int,b:Int)(c:Int,d:Int)={
  a+b+c+d
}

语法介绍重点还在后续博文中,敬请关注小二课堂

小二推荐:算法大学堂

猜你喜欢

转载自blog.csdn.net/Mirror_w/article/details/89348834
今日推荐