• Scala (二):基本语法


    注:

    本内容依赖相关参考资料以及本人理解,不保证100%正确,仅供参考

    欢迎大家指出错误之处,一同交流、学习。

    参考资料:

     

    上一篇:Scala (一):Scala简介和HelloWorld

    一:声明值和变量

    Scala有两种类型的变量:

    • val:不可变,相当于常量,在声明的时候必须初始化,且初始化后不可再赋值
    • var:可变,变量,在声明的时候需要进行初始化,初始化后可以对其再次赋值

    Scala有自动类型推导,如:

    系统自动推断出来变量myStr 为字符串模式(String类来自java.lang.String Scala直接使用java的定义,未自己定义此数据结构)

    同时我们也可以显式的指定类型:

    var myStr: String = "I love Scala!"
    var myStr2: java.lang.String = "I'm string class from java"  // Scala 的 String类是直接使用的java String类

    其中 : 分隔了变量名和类型,和java不同,scala是变量名在前,类型在后,并以:分隔,这里要注意

    其它,例:

    二:基本数据类型和操作

    数据类型:

    • Scala的数据类型包括:Byte, Char, Short, Int, Long, Float, Double和Boolean
    • 和Java不同的是,这些类型都是“类”,并且都是包scala的成员。比如Int的全名是scala.Int 。对于字符串,Scala用的是java.lang.String类来表示字符串

    参考:

    字面量 literal

    通常我们还有一个术语,字面量(英文literal)

    字面量通俗的来说就是值

    如下图

    我们后面会说字面量,字面量对于我们理解Scala中的函数有很大帮助,这里大家先知道,字面量是什么

    操作符:

      scala有: + - * / % 等操作符,在scala中,操作符就是方法。例如: 5 + 3 和 5.+(3) 是等价的,也就是说:

    a  方法  b  等价于: a.方法(b)
    

      前者是后者的简写形式,+是方法名,如示例的5.+(3),+是Int类中的一个方法

      Scala没有提供++ 和 -- 的操作符,如果需要递增或者递减的时候,可以 使用 += 或者 -=, 比如

      

    var x = 1
    x += 1
    

    富包装类:

    • 对于基本数据类型,除了上述提到的各种操作符外,Scala还提供了了其他常用运算的方法,只是这些方法不在基本的类中提供,而是被封装到了一个富包装类中(富裕的包装类)

    • 每个基本类型都有一个对应的富包装类,例如Int有一个RichInt类、String有RichString类,这些类位于包:scala.runtime中

    • 当对数据类型的对象调用其富包装类提供的方法,Scala会自动隐式转换将该对象转换成对应富包装类的对象,用以使用相应的方法,如:Int类中没有提供max方法,如果我们键入:3 max 5 会自动转换成RichInt类执行操作,因为max方法定义在RichInt

    • 富包装类是对基础类的包装,富是富裕的意思,表示比基础类提供更多的方法  

     Range:

     在使用for循环的时候我们经常会使用的数组序列,比如,x的值从1到10,我们可以采用Range实现

    Range可以创建不同数据类型的数值序列,包括Int,Long,Double,Char,BigInt,BigDecimal等

    步长:创建range的时候可以指定步长(相邻两个元素之差)

    示例:

    创建一个1到10的序列,步长为1

    scala> 1 to 10
    res0: scala.collection.immutable.Range.Inclusive = Range 1 to 10
    
    scala> res0.toBuffer
    res1: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    

    如上代码,1 to 10 会创建一个 range

    调用toBuffer,可以显示内容为1, 2, 3, 4, 5, 6, 7, 8, 9, 10

    res0,是scala shell中对于匿名对象的调用名称,每创建一个匿名(无名称)对象后,shell都会默认给出一个名称resx    其中x 从0开始递增,步长1

    不指定步长,步长默认为1

    创建一个步长为2 的序列

    scala> 1 to 10 by 2
    res2: scala.collection.immutable.Range = inexact Range 1 to 10 by 2
    
    scala> res2.toBuffer
    res3: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 3, 5, 7, 9)
    

    如上代码,by关键字用来指定步长

    这样我们得到了一个步长为2 的 1 ~ 10 的序列

    因为步长为2 所以最终得到的range是 1, 3, 5, 7 ,9  

     创建一个Float类型的序列,从0.5f 到11.5f , 步长0.3f

    scala> 0.5f to 11.5f by 0.3f
    <console>:12: warning: method to in trait FractionalProxy is deprecated (since 2.12.6): use BigDecimal range instead
           0.5f to 11.5f by 0.3f
                ^
    res0: scala.collection.immutable.NumericRange[Float] = NumericRange 0.5 to 11.5 by 0.3
    
    scala> res0.toBuffer
    res1: scala.collection.mutable.Buffer[Float] = ArrayBuffer(0.5, 0.8, 1.1, 1.4000001, 1.7, 2.0, 2.3000002, 2.6000001, 2.9, 3.2, 3.5, 3.8000002, 4.1000004, 4.4, 4.7000003, 5.0, 5.3, 5.6000004, 5.9, 6.2000003, 6.5, 6.8, 7.1000004, 7.4, 7.7000003, 8.0, 8.3, 8.6, 8.900001, 9.200001, 9.5, 9.8, 10.1, 10.400001, 10.700001, 11.0, 11.3)

    这里给出的警告是让我们使用BigDecimal来产生range,我们后面会说BigDecimal

    欢迎转载,欢迎提出意见

    如果本文对您有帮助,还请点击一下推荐哦,Thanks♪(・ω・)ノ

    https://www.cnblogs.com/bigdatacaoyu

  • 相关阅读:
    String 尺取法
    dos 命令
    又见01背包
    01串
    Python-Matplotlib 10 面向对象 VS Matlab Style
    [ 转 ] Fiddler 教程
    Android 查看设备文件
    Python-Matplotlib 9 颜色和样式 [r]
    Python-Matplotlib 8 箱形图
    Python-Matplotlib 7 饼状图
  • 原文地址:https://www.cnblogs.com/bigdatacaoyu/p/10922172.html
Copyright © 2020-2023  润新知