Scala编程快速入门

Stella981
• 阅读 724

1.scala数据类型

Scala编程快速入门

上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。例如数字1可以调方法,使用1.方法名。scala拥有和java一样的数据类型,和java的数据类型的内存布局完全一致,精度也完全一致。

Unit:表示没有返回值;

Nothing:表示没有值,是所有类型的子类型,创建一个类就一定有一个子类是Nothing;

Any:是所有类型的超类;

AnyRef:是所有引用类型的超类

Scala编程快速入门

Scala编程快速入门

如上两图所示,可见所有类型的基类是Any。Any之后分为两个AnyVal与AnyRef。其中AnyVal是所有数值类型的父类型,AnyRef是所有引用类型的父类型。

Scala还定义了底类型,其中Null类型是所有引用类型的底类型,所有AnyRef的类型的空值都是Null;而Nothing是所有类型的底类型和Any类型相对应,Null与Nothing都表示空。

String继承自AnyRef。与Java,Scala中的String也是内存不可变对象,及所有的字符串操作都会产生新的字符串。

Int等基础类型都是Scala包装的类型,例如Int类型对应的是Scala.Int只是Scala包会被每个源文件自动引用。

Option类型用来表示可能存在、也可能不存在的值。样例子类:Some("Fred")表示包装了某值。样例:None表示没有值。

2.声明与定义

常量声明

常量声明使用“val”值不可改变。

val firstname : String = "wang"
val lastname = "xiaoming"        //可以省略类型

变量声明

变量声明使用“var”值可以改变。

var name:String = "sean"
var myname = "fengjia"    //可以省略类型

函数声明

函数或者表达式的声明使用“def”

object HelloScala {

  def main(args: Array[String]): Unit = {
    println(x)
    println(y)
  }
  val a = 3
  var b = 2
  val x = a * b          //定义常量名"x",会直接计算值
  def y = a * b          //这里只是定义表达式名字"y",不计算值
  
}

3.字符串

注释

同java注释相同:单行注释“//”,多行注释“/* **/”

字符串

同java字符串。

多行字符串

  scala中可以定义多行字符串

  var str =
    """
      hello 
      scala
    """

s字符串

s字符串可以调用“变量/常量”,在字符串前面加s,在字符串中使用“$变量/常量名”的数学表达式,来调用变量。字符串之前不写s,则原样输出。

    val name = "sean"
    println(s"hello $name")
    println("hello $name")

输出:

hello sean
hello $name

f字符串

在字符串前加f使用格式化变量功能。变量名后面加%s是表示字符串,变量名后面加%.2f是精确到百分位。

    val name = "sean"
    val height = 1.7
    println(f"hello $name%s is $height%.2f")
    println(s"hello $name%s")
    println("hello $name%s is $height%.2f")

输出:

hello sean is 1.70
hello sean%s
hello $name%s is $height%.2f

R字符串

在scala中如果要输出“\t”、“\n”等字符串时需要加转义符“\”否则会按照制表符或换行符输出。r字符串的使用是在字符串前面加raw,则可以将“\t”、“\n”等原样输出。

    println("a\tb")
    println(raw"a\tb")

输出:

a    b
a\tb

4.Scala 函数

1.函数形式

Scala编程快速入门

函数简化形式

Scala中,可以不写return,如果不写return则自动将最后一行作为返回值,如果没有返回值,则函数的返回类型为Unit,类似于Java中void。

  def max(x:Int,y:Int)={
    if (x>y)
      x
    else
      y
  }

这里还可以进一步把方法体的花括号也省略,所以函数可以进一步简化为

  def min(x:Int,y:Int)=
    if(x<y)
      x
    else
      y

案例一(单个参数,参数设置初始值)

定义sayMyName方法,方法需要一个参数,类型是String,默认值是sean。如果使用参数则按照参数计算,如果不适用参数则使用默认值。

object HelloScala2 {

  def main(args: Array[String]): Unit = {
    sayMyName()
    sayMyName("jiafeng")
  }

  def sayMyName(name:String = "sean"): Unit ={
    println(name)
  }

}

案例二(可变参数)

多个相同类型的参数可以使用*表示,例如(k : Int*)表示多个Int类型的参数,具体数量不确定,类似于java中的可变参数。

  def main(args: Array[String]): Unit = {
    var sum = sumParam(1,2,3,4,5)
    println(sum)
  }

  def sumParam(n : Int *) ={
    var sum = 0
    for (i <- n){
      sum += i
    }
    sum
  }

案例三(下划线做参数)

调用add方法使用下划线是一个符号表示一个变量名。

  def main(args: Array[String]): Unit = {
    var add = add2(5)
    println(add)
  }

  def add(a : Int,b : Int) = a + b
  def add2 = add(_ : Int,1)

2.递归调用

递归实际上就是方法自己调用自己,也可以称之为递归公式。

  def main(args: Array[String]): Unit = {
    var f = fact(9)
    println(f)
  }

  def fact(n : Int) : Int = {
    if(n <= 0){
      println("if:"+n)
      1
    }else{
      println("else:"+n)
      n * fact(n - 1)
    }
  }

执行结果

else:9
else:8
else:7
else:6
else:5
else:4
else:3
else:2
else:1
if:0
362880

3.柯里化函数

https://www.cnblogs.com/yangp/p/8575705.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这