Scala语言笔记 - 第一篇

目录

Scala语言笔记 - 第一篇

​ 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程(Function Programming)能力,记录下最近学习的一些新的和技巧。注意:本系列博客不会从头讲解该语言的语法,而是通过一些例子讲解该语言的一些技巧,如果需要从头学习scala,建议使用该教程快速入门。

1 基本类型和循环的使用

​ 看如下代码:

def main(args: Array[String]): Unit = {

     //声明类型,不写类型的话,scala会根据具体的值进行类型推断,如果不写类型,则必须进行初始化
    var sum:Int = 0

    /*
     * var: 可以进行重新赋值,但是需要注意的是:scala是静态语言,因此不能赋值为其他类型的
     * val: 不可变类型,类似于Java的final
     */
    var str = "hello world"
    //str = 1    //这样是不可以的,str已经是String类型,不可以再被赋值为Int
    //普通的函数调用
    val res = func(str)

    //包含5
    for (num <- 1 to 5) {
      print("num:" + num + "\t")
    }

    println("")
    //不包含5,这个<-不好打,不知道怎么想的o(* ̄︶ ̄*)o
    for (num <- 1 until 5) {
      print("num:" + num + "\t")
    }
    println("Result" + res)
}


/**
    * Scala的函数定义,类型在后面,冒号后面的是返回值,{}的为函数体
    * 如果函数体只有一两行,那么可以不写大括号
    * @param str
    * @return
    */
  def func(str: String): String = {
    println("This is your str:" + str)
    //类似于Ruby,最后一行默认为返回值
    "my String"
  }

2 String相关

​ scala和Java类型,String类型是可以变类型,因此,构建String的时候,最好使用StringBuilder来进行拼接。

//因为string是不可变的,因此,可使用StringBuilder来处理该情况
  def strTest(): Unit = {
    var str = "hello world"
    var str1:String = " this is scala"
    println("str + str1:" + (str + str1))

    //使用StringBuilder进行字符串的拼接
    var sb = new StringBuilder
    //在scala中,++=其实是一个函数,这里是在进行函数调用
    sb ++= "hello"
    sb ++= "world"
    // += 是char
    sb += 'd'
    println("sb:" + sb.toString)

    /*
     * mkString是一个很好用的方法,三个参数分别为:head middle footer,因此这段代码最终生成的结果为:
     * /**
        * this is a comment
        * another line
        */
     * 一段标准的多行注释
     */
    str = "\nthis is a comment\nanother line"
    var res = str.split("(\r\n)|\r|\n").mkString("/**", "\n * ", " \n */")
    println(res)
  }

3 模式匹配相关

​ scala中最大的一个特点就是其强大的模式匹配功能,我们看下面的一段代码:

//模式匹配
def matchTest(): Unit ={
  println(matchTestInternal(1))
  println(matchTestInternal("hello"))
  println(matchTestInternal(2L))
}

//匹配到任何一个,就直接返回,不会再去匹配其他的,和switch不一样
//Any表示可以匹配任意类型
def matchTestInternal(x: Any) : Any = {
  x match {
    case 1 => "one"
    case str:String => "String"
    case integer:Int => "Integer"
    //other. similiar to default,在scala中_的用途非常多
    case _ => "Other"
  }
}

4 class相关

​ scala中的class可以定义在任何地方,没有Java文件名和类名必须保持一致的限制,且,在scala中,构造方法也和Java有很大的区别。

//scala定义class的方式有些不同,定义带参数的类时,参数是写在类里面的
def classTest(): Unit ={
    //在scala中,构造方法的参数是直接放在类名后面 
  class HelloClass(val _name:String, val _age:Int){
    private var name = _name
    private var age = _age

    def getAge(): Int ={
      return age
    }

    //覆写非抽象方法,必须要有override
    override def toString: String = {
      "name:" + name + "  age:" + age
    }
  }

    //定义子类的时候,如果要覆盖父类中的变量,那么也需要写上override
  class HelloChildClass(override val _name:String, override val _age:Int) extends  HelloClass(_name, _age)
  {
    private var name = _name
    private var age = _age

    override def toString: String = {
      "Child class's toString[" + "name:" + name + " age:" + age + "]"
    }
  }

  //对刚才定义好的类进行调用
  val name = "name"
  val age = 10
  var child = new HelloChildClass(name, age)
  child.getAge()
  println(child.toString)

  var child2:HelloClass  = new HelloChildClass(name, age)
  child2.getAge()
  println(child2.toString)
}

5 函数调用相关

​ 因为scala对于函数式编程的天然支持,所以该语言中会出现大量的函数传值,并且还支持很多简略的写法,比如调用简单函数时可以不写(),比如支持函数的柯里化(Currying)

def funcTest(): Unit = {
  //函数可以作为参数进行传递,但是方法不行,并且函数必须要有参数列表
  //定义一个函数
  var x = 10
  var y = 20
  //传入函数
  funcWithFunc(myBody)
  //调用mybody2,把二元参数调用转换为一元参数调用,这种做法叫做函数的柯里化(Currying),是一个数学里面的概念
  myBody2(1)(2)

  //定义一个短小精悍的func
  var f1 = (x:Int, y:Int) => x * y
  //直接传给function
  funcWithFunc(f1)

  //函数传名调用和传值调用,传值调用:直接计算函数的值,然后传给另外一个函数,传名调用:在函数内部进行调用
  acceptTime(time())
  println("-----------------------")
  acceptTime2(time())

  println("-----------call aVerySumpleFunc---------------")
  //这里调用的时候,可以不用写(),自动进行调用
  println(aVerySimpleFunc.length)
  println("----------------------------------------------")
    
  println("-------------call funcWithFuncPara------------")
  //表示调用funcWithFuncPara函数,这个函数接受一个返回Int类型的函数作为参数,参数函数不需要传入任何参数,
  //因此,在scala中,可以采用大括号的方式快速创建一个没有任何参数的函数
  funcWithFuncPara {
      println("This is func para!")
      100
  }
  println("----------------------------------------------")
}

//该函数的参数为一个只返回Int类型的函数,调用这种函数的时候,可以采用大括号进行非常精简的调用
def funcWithFuncPara(f : => Int) : Unit = {
    println("This is a function with a simple function parameter")
    f
}

//一个非常简单的function,当调用这种func的时候,可以不用写()
def aVerySimpleFunc() = "String"

def myBody(x:Int, y:Int) : Int = {
  var sum = x + y
  println("x + y = " + sum)
  sum
}

//注意,也可以采用这种写法,两个连着的括号表示两个参数的传递,也可以使用myBody那种传统的写法
def myBody2(x:Int)(y:Int) : Int={
  println("--------------------myBody2---------------------------")
  println(s"x=$x  y=$y")
  println("--------------------end---------------------------")
  0
}

//可以接受函数作为参数的函数
def funcWithFunc(body : (Int, Int) => Int): Int =
{
  body(10,20)
}

def time() : Long ={
  println("Now, Get the nano time.")
  System.nanoTime()
}

// => 表示是一个传名调用,其实本质上就是接受一个函数为参数
def acceptTime(body : => Long): Unit = {
  println("acceptTime() enter...")
  println("Now, will call the body")
    //这里的body表示直接进行调用的意思
  println("body get time:" + body)
}

// 表示是一个普通调用,传值调用
def acceptTime2(body : Long) : Unit = {
  println("acceptTime2() enter...")
  println("Now, will call the body")
  println("body get time:" + body)
}

原文地址:https://www.cnblogs.com/seancheer/p/10773357.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 TwemojiTwemoji是Twitter开源的其完整的Emoji表情图片。开发者可以去GitHub下载完整的表情库,并把这些表情加入到自己的应用或网页中。使用示例:var i = 0;twemoji.parse(  ’emoji, m\u276
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即两个对象在内存中的首地址;equals比较字符串中所包含的内容是否相同。publicstaticvoidmain(String[]args){​ Strings1="abc"; Strings2=newString("abc");​ System.out.println(s1==s2)
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么使用”吧!语法scala...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相信很多人在Scala是一种什么语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相信很多人在Scala Trait怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日常操作中,相信很多人在Scala类型检查与模式匹配怎么使用问题上存在疑惑,小编查阅了各式资料,整理...
这篇文章主要介绍“scala中常用但不常见的符号有哪些”,在日常操作中,相信很多人在scala中常用但不常见的符号有哪些问题上存在疑惑,小编查阅了各式资料,整理...
本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”...
本篇内容介绍了“scala基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容介绍了“Scala下划线怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容主要讲解“Scala提取器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala提取器怎么使用”...
这篇文章主要讲解了“Scala基础语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala基础语法有...
本篇内容主要讲解“Scala方法与函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala方法与函数怎...
这篇文章主要讲解了“scala条件控制与循环怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala条...
这篇文章主要介绍“scala函数怎么定义和调用”,在日常操作中,相信很多人在scala函数怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操
这篇文章主要介绍“scala如何声明变量”,在日常操作中,相信很多人在scala如何声明变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
这篇文章主要讲解了“scala的Map和Tuple怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala的Ma...
这篇文章主要介绍“scala的隐式参数有什么作用”,在日常操作中,相信很多人在scala的隐式参数有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
本篇内容主要讲解“Scala怎么进行文件写操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么进行文件...
这篇文章主要讲解了“Scala怎么声明数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala怎么声明数组...