Scala篇

本文详细讲解了Scala中的Unit、Nothing、Any、AnyRef和AnyVal类型,单例对象与类的特性,变量与常量的区别,方法定义与递归,参数默认值、可变长参数和匿名函数的应用,以及高阶函数、柯里化和偏应用函数。适合初学者和进阶者理解Scala的语法和核心概念。
摘要由CSDN通过智能技术生成

Unit 表示无值,和java中void等同。

Nothing 所有其他类型的子类型,表示没有值

Any 所有类型的超类型,任何实例都属于Any类型

AnyRef 所有引用类型的超类

AnyVal 所有值类型的超类

 Scala:

1.Scala object相当于java中的单例,object中定义的全是静态的。相当于java的工具类。Object不可以传参,对象要传参,使用apply方法。

2.Scala中定义变量使用var,定义常量使用val,变量可变,常量不可变,变量和常量类型可以省略不写,会自动推断。

3.Scala中每行后面都会有分号自动推断机制,不用显示写出“;”

4.建议在Scala中命名使用驼峰命名法。

5.Scala类中可以传参,传参一定要指定类型,有了参数就有了默认的构造。类中的属性默认有getter和setter方法。

6.类中重写构造时,构造中第一行必须先调用默认的构造。def this(....){....}

7.Scala中当new class 时,类中除了方法不执行【除了构造方法】,其他都执行。

8.在同一个scala文件中,class名称和object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的伴生对象,他们之间可以互相访问私有变量。

方法定义:

1.方法体中最后返回值可以使用return,如果使用了return。那么方法体的返回值类型一定要指定。

2.如果方法体中没有return。默认将方法体中最后一行计算的结果当作返回值返回。方法体的返回值可以省略,会自动推断返回值的类型。

3.定义方法体传入的参数一定要指定类型

4.方法的方法体如果可以一行搞定,那么方法体的“{...}”可以省略

5.如果定义方法时,省略了方法名称和方法体之间的”=“,那么无论方法体最后一行计算的结果是什么,都会被丢弃,返回Unit

package com.bjsxt.scala

class Person(xname:String,xag:Int){
    val name = xname
    var age = xag
    var gender = 'M'
  def this(yname:String, yage:Int, ygender:Char){
    this(yname,yage)
    this.gender = ygender
  }
  def sayName()={
    println("hello world..." + Lesson_ClassAndObj.name)
  }

}

object Lesson_ClassAndObj {
  val name = "wangwu"
  def main(args: Array[String]): Unit = {
    val p = new Person("zhangsan",20)
    println(p.gender)
    val p1 = new Person("diaochan",18,'F')
    println(p1.gender)
//    p.age = 500
//    println(p.name)
//    println(p.age)
//    p.sayName()

//    val a = 100
//    var b = 200
//    b = 300
//    println(b)
  }
}

递归方法:递归方法要显示的声明函数的返回值类型

def main(args: Array[String]): Unit = {
  def fun(num:Int):Int={
    if (num==1){
      1
    }else{
      num*fun(num-1)
    }
  }
  println(fun(num=5))
 
}

参数有默认值的方法

def fun(a:Int=10,b:Int=20)={
  a+b
}

println(fun(b = 200))

可变长参数的方法

 

 def fun(s:String*)={
      s.foreach(println)
//      for (elem<-s){
//        println(elem)
//      }
    }
    fun("hello","a","b","c")

匿名函数:“=>”就是匿名函数,多用于方法的参数是函数时,常用匿名函数

 

def fun:(Int,Int)=>Int = (a:Int,b:Int)=>{
  a+b
}
println(fun(100,200))

var funl:String => Unit = (s:String) => {
  println(s)
}
funl("hello")

 嵌套方法

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

偏应用函数:某些情况下,方法中参数非常多,调用这个方法非常频繁,每次调用只要固定的某个个参数变化,其他都不变,可以定义偏应用来实现。

def showLog(date:Date,log:String)={
  println(s"data is $date,log is $log")
}
val date = new Date()
showLog(date,"a")
showLog(date,"b")
showLog(date,"c")

def function1 = showLog(date,_:String)
function1("aaa")
function1("bbb")
function1("ccc")

 高阶函数:

1.方法的参数是函数

def function1(f:(Int,Int)=>Int,s:String):String = {
  val i = f(100,200)
  i+"#"+s
}
val result = function1((a:Int,b:Int)=>{a*b},"scala")
println(result)

2.方法的返回值是函数

def function1(s:String)={
  def function2(s1:String,s2:String):String ={
    s1+"~"+s2+"#"+s
  }
  function2 _
}
println(function1("a")("b","c"))

3.方法的参数和返回值都是函数

def function0(f:(Int,Int)=>Int):(String,String)=>String = {
  val i:Int = f(1,2)
  def function1(s1:String,s2:String):String = {
    s1+"@"+s2+"*"+i
  }
  function1
}
println(function0((a,b)=>{a+b})("hello","world"))

柯里化函数

def function1(a:Int,b:Int)(c:Int,d:Int)={
  a+b+c+d
}
println(function1(1,2)(3,4))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TGKD DFN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值