当前位置:首页 > 后端开发 > 正文内容

Scala语法篇

邻居的猫1个月前 (12-09)后端开发1663

Scala根底篇

数据类型

下表中列出的数据类型都是方针,能够直接对它们调用办法。

数据类型 描绘
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 规范的单精度浮点数
Double 64 位 IEEE 754 规范的双精度浮点数
Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String 字符序列
Boolean true或false
Unit 表明无值,和其他言语中void同等。用作不回来任何成果的办法的成果类型。Unit只要一个实例值,写成()。
Null null 或空引证
Nothing Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。
Any Any是一切其他类的超类
AnyRef AnyRef类是Scala里一切引证类(reference class)的基类

表明Long类型,在数字后边增加L或许l作为后缀;浮点数后边有f或许F后缀时,表明Float类型,不然便是Double

变量

用关键词“var”声明变量,关键词"val"声明常量。

var myName : String = "gyt"
val myAge : Int = 21 

scala中纷歧定要指明数据类型,其数据类型通过变量或常量的初始值揣度出来的,因而,在没有指明数据类型的情况下,有必要要给出初始值。

拜访润饰符

private关键词润饰,只能被当时类以及当时类的内部类拜访到,外层类拜访不到。

class Outer{
    class Inner{
        private def f(){
            println("f")
        }
        class InnerMost{
            f() // 正确
        }
    }
    (new Inner).f() //过错
}

protected关键词润饰,只能被当时类的子类拜访。

package p {
    class Super {
        protected def f() {println("f")}
    }
    class Sub extends Super {
        f()
    }
    class Other {
        (new Super).f() //过错
    }
}

没有指定任何润饰符,默许为public,在任何地方都能够被拜访。

条件和循环

以下是IF...ELSE句子实例。

object Test {
   def main(args: Array[String]) {
      var x = 30;

      if( x == 10 ){
         println("X 的值为 10");
      }else if( x == 20 ){
         println("X 的值为 20");
      }else if( x == 30 ){
         println("X 的值为 30");
      }else{
         println("无法判别 X 的值");
      }
   }
}

以下是一个运用了 i to j 语法(包括 j)的实例,箭头 <- 用于为变量 a 赋值。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      // for 循环
      for( a <- 1 to 10){
         println( "Value of a: " + a );
      }
   }
}

for 循环 中你能够运用分号;来设置多个区间,它将迭代给定区间一切的或许值。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      var b = 0;
      // for 循环
      for( a <- 1 to 3; b <- 1 to 3){
         println( "Value of a: " + a );
         println( "Value of b: " + b );
      }
   }
}

for 循环调集的语法如下。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      val numList = List(1,2,3,4,5,6);

      // for 循环
      for( a <- numList ){
         println( "Value of a: " + a );
      }
   }
}

你能够将 for 循环的回来值作为一个变量存储。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      val numList = List(1,2,3,4,5,6,7,8,9,10);

      // for 循环
      var retVal = for{ a <- numList 
                        if a != 3; if a < 8
                      }yield a

      // 输出回来值
      for( a <- retVal){
         println( "Value of a: " + a );
      }
   }
}

函数式编程(要点)

函数式编程:关于相同的输入永久会得到相同的输出,而且没有任何能够调查的副作用,也不依赖外部的环境状况。参阅什么是函数式编程?。

Scala中函数是为完结某一功用的程序句子的调集,类中界说的函数称之为办法。下面是办法的一个实例。

object add{
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

可变参数:咱们不需要指定函数参数的个数,能够向函数传入可变长度参数列表。通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。

object Test {
   def main(args: Array[String]) {
        printStrings("Runoob", "Scala", "Python");
   }
   def printStrings( args:String* ) = {
      var i : Int = 0;
      for( arg <- args ){
         println("Arg value[" + i + "] = " + arg );
         i = i + 1;
      }
   }
}

默许参数: scala能够为函数参数指定默许参数值,运用了默许参数,你在调用函数的进程中能够不需要传递参数,这时函数就会调用它的默许参数值,假如传递了参数,则传递值会替代默许值。

object Test {
   def main(args: Array[String]) {
        println( "回来值 : " + addInt() );
   }
   def addInt( a:Int=5, b:Int=7 ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

匿名函数:箭头左面是参数列表,右边是函数体。

var inc = (x: Int) => {x+1}
var x = inc(7) - 1

//界说一个函数,以函数作为参数输入
def f(func: String => Unit): Unit = {
    func("gyt")
}
var fun = (name: String) => {println(name)}
f(fun)

传名调用:传递的不是详细的值,而是代码块。和一般的传值调用比较,每次运用传名调用时,解说器都会核算一次表达式的值。

def f1(): Int = {
    println("f1被调用")
    12
}
def f2(a: => Int): Unit = {
    println(a)
    println(a)
}
f2(f1())

至简准则

(1)函数中的return能够省掉,以最终一行代码作为代码块的回来值。

def f1(name: String): String = {
    name
}

(2)假如函数体只要一行代码,能够省掉花括号。

def f2(name: String): String = name

(3)假如编译器能够揣度出来回来值,那么能够省掉(:和回来值类型一同省掉)。有意思的是,到这一步,scala函数的办法形如数学中的f(x) = y。

def f3(name: String) = name

(4)假如有return,则(3)不适用。

(5)假如回来值是Unit,能够省掉等号和回来值,可是此刻花括号不能省掉。

def f4(name: String) {
    println(name)
}

(6)假如函数没有参数,那么调用它的时分能够直接用函数名。不必加“()”。

闭包:假如一个函数,拜访到它的外部(部分)变量的值,那么这个函数和它所在的环境,称为闭包。

柯里化:将本来承受两个参数的函数变成新的承受一个参数的函数的进程。新的函数回来一个以原有第二个参数为参数的函数。

object Test {
   def main(args: Array[String]) {
      val str1:String = "Hello, "
      val str2:String = "Scala!"
      println( "str1 + str2 = " +  strcat(str1)(str2) )
   }

   def strcat(s1: String)(s2: String) = {
      s1 + s2
   }
}

字符串

在 Scala 中,字符串的类型实际上是 Java String,它自身没有 String 类。

序号 办法及描绘
1 char charAt(int index)回来指定方位的字符
2 int compareTo(Object o)比较字符串与方针
3 int compareTo(String anotherString)按字典次序比较两个字符串
4 int compareToIgnoreCase(String str)按字典次序比较两个字符串,不考虑巨细写
5 String concat(String str)将指定字符串衔接到此字符串的完毕
6 boolean contentEquals(StringBuffer sb)将此字符串与指定的 StringBuffer 比较。
7 static String copyValueOf(char[] data)回来指定数组中表明该字符序列的 String
8 static String copyValueOf(char[] data, int offset, int count)回来指定数组中表明该字符序列的 String
9 boolean endsWith(String suffix)测验此字符串是否以指定的后缀完毕
10 boolean equals(Object anObject)将此字符串与指定的方针比较
11 boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 比较,不考虑巨细写
12 byte getBytes()运用渠道的默许字符集将此 String 编码为 byte 序列,并将成果存储到一个新的 byte 数组中
13 byte[] getBytes(String charsetName运用指定的字符集将此 String 编码为 byte 序列,并将成果存储到一个新的 byte 数组中
14 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此字符串复制到方针字符数组
15 int hashCode()回来此字符串的哈希码
16 int indexOf(int ch)回来指定字符在此字符串中榜首次呈现处的索引
17 int indexOf(int ch, int fromIndex)回来在此字符串中榜首次呈现指定字符处的索引,从指定的索引开端查找
18 int indexOf(String str)回来指定子字符串在此字符串中榜首次呈现处的索引
19 int indexOf(String str, int fromIndex)回来指定子字符串在此字符串中榜首次呈现处的索引,从指定的索引开端
20 String intern()回来字符串方针的规范化表明办法
21 int lastIndexOf(int ch)回来指定字符在此字符串中最终一次呈现处的索引
22 int lastIndexOf(int ch, int fromIndex)回来指定字符在此字符串中最终一次呈现处的索引,从指定的索引处开端进行反向查找
23 int lastIndexOf(String str)回来指定子字符串在此字符串中最右边呈现处的索引
24 int lastIndexOf(String str, int fromIndex)回来指定子字符串在此字符串中最终一次呈现处的索引,从指定的索引开端反向查找
25 int length()回来此字符串的长度
26 boolean matches(String regex)奉告此字符串是否匹配给定的正则表达式
27 boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)测验两个字符串区域是否持平
28 boolean regionMatches(int toffset, String other, int ooffset, int len)测验两个字符串区域是否持平
29 String replace(char oldChar, char newChar)回来一个新的字符串,它是通过用 newChar 替换此字符串中呈现的一切 oldChar 得到的
30 String replaceAll(String regex, String replacement运用给定的 replacement 替换此字符串一切匹配给定的正则表达式的子字符串
31 String replaceFirst(String regex, String replacement)运用给定的 replacement 替换此字符串匹配给定的正则表达式的榜首个子字符串
32 String[] split(String regex)依据给定正则表达式的匹配拆分此字符串
33 String[] split(String regex, int limit)依据匹配给定的正则表达式来拆分此字符串
34 boolean startsWith(String prefix)测验此字符串是否以指定的前缀开端
35 boolean startsWith(String prefix, int toffset)测验此字符串从指定索引开端的子字符串是否以指定前缀开端。
36 CharSequence subSequence(int beginIndex, int endIndex)回来一个新的字符序列,它是此序列的一个子序列
37 String substring(int beginIndex)回来一个新的字符串,它是此字符串的一个子字符串
38 String substring(int beginIndex, int endIndex)回来一个新字符串,它是此字符串的一个子字符串
39 char[] toCharArray()将此字符串转换为一个新的字符数组
40 String toLowerCase()运用默许言语环境的规矩将此 String 中的一切字符都转换为小写
41 String toLowerCase(Locale locale)运用给定 Locale 的规矩将此 String 中的一切字符都转换为小写
42 String toString()回来此方针自身(它已经是一个字符串!)
43 String toUpperCase()运用默许言语环境的规矩将此 String 中的一切字符都转换为大写
44 String toUpperCase(Locale locale)运用给定 Locale 的规矩将此 String 中的一切字符都转换为大写
45 String trim()删去指定字符串的首尾空白符
46 static String valueOf(primitive data type x)回来指定类型参数的字符串表明办法

数组

Scala 言语中供给的数组是用来存储固定巨细的同类型元素。下面是声明数组的三种办法。

var z:Array[String] = new Array[String](3)
var zz = new Array[String](3)
var zzz = Array("Runoob", "Baidu", "Google")

形式匹配

一个形式匹配包括了一系列备选项,每个都开端于关键字 case。每个备选项都包括了一个形式及一到多个表达式。箭头符号 => 隔开了形式和表达式。

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

实例中榜首个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型形式,用于判别传入的值是否为整型,比较运用isInstanceOf来判别类型,运用形式匹配更好。第四个 case 表明默许的全匹配备选项,即没有找到其他匹配时的匹配项,相似 switch 中的 default。

object Test {
   def main(args: Array[String]) {
        val alice = new Person("Alice", 25)
        val bob = new Person("Bob", 32)
        val charlie = new Person("Charlie", 32)
   
    for (person <- List(alice, bob, charlie)) {
        person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // 样例类
   case class Person(name: String, age: Int)
}

运用了case关键字的类界说便是样例类(case classes),样例类是种特别的类,通过优化以用于形式匹配。

迭代器

Scala Iterator(迭代器)不是一个调集,它是一种用于拜访调集的办法。迭代器 it 的两个根本操作是 nexthasNext。调用 it.next() 会回来迭代器的下一个元素,而且更新迭代器的状况。调用 it.hasNext() 用于检测调集中是否还有元素。让迭代器 it 逐一回来一切元素最简略的办法是运用 while 循环:

object Test {
   def main(args: Array[String]) {
      val it = Iterator("Baidu", "Google", "Runoob", "Taobao")
      
      while (it.hasNext){
         println(it.next())
      }
   }
}

下表列出了Scala Iterator常用的办法:

序号 办法及描绘
1 def hasNext: Boolean假如还有可回来的元素,回来true。
2 def next(): A回来迭代器的下一个元素,而且更新迭代器的状况
3 def ++(that: => Iterator[A]): Iterator[A]兼并两个迭代器
4 def ++[B >: A](that :=> GenTraversableOnce[B]): Iterator[B]兼并两个迭代器
5 def addString(b: StringBuilder): StringBuilder增加一个字符串到 StringBuilder b
6 def addString(b: StringBuilder, sep: String): StringBuilder增加一个字符串到 StringBuilder b,并指定分隔符
7 def buffered: BufferedIterator[A]迭代器都转换成 BufferedIterator
8 def contains(elem: Any): Boolean检测迭代器中是否包括指定元素
9 def copyToArray(xs: Array[A], start: Int, len: Int): Unit将迭代器中选定的值传给数组
10 def count(p: (A) => Boolean): Int回来迭代器元素中满意条件p的元素总数。
11 def drop(n: Int): Iterator[A]回来丢掉前n个元素新调集
12 def dropWhile(p: (A) => Boolean): Iterator[A]从左向右丢掉元素,直到条件p不成立
13 def duplicate: (Iterator[A], Iterator[A])生成两个能别离回来迭代器一切元素的迭代器。
14 def exists(p: (A) => Boolean): Boolean回来一个布尔值,指明迭代器元素中是否存在满意p的元素。
15 def filter(p: (A) => Boolean): Iterator[A]回来一个新迭代器 ,指向迭代器元素中一切满意条件p的元素。
16 def filterNot(p: (A) => Boolean): Iterator[A]回来一个迭代器,指向迭代器元素中不满意条件p的元素。
17 def find(p: (A) => Boolean): Option[A]回来榜首个满意p的元素或None。留意:假如找到满意条件的元素,迭代器会被置于该元素之后;假如没有找到,会被置于结尾。
18 def flatMap[B](f: (A) => GenTraversableOnce[B]): Iterator[B]针对迭代器的序列中的每个元素使用函数f,并回来指向成果序列的迭代器。
19 def forall(p: (A) => Boolean): Boolean回来一个布尔值,指明 it 所指元素是否都满意p。
20 def foreach(f: (A) => Unit): Unit在迭代器回来的每个元素上履行指定的程序 f
21 def hasDefiniteSize: Boolean假如迭代器的元素个数有限则回来 true(默许同等于 isEmpty)
22 def indexOf(elem: B): Int回来迭代器的元素中index等于x的榜首个元素。留意:迭代器会跳过这个元素。
23 def indexWhere(p: (A) => Boolean): Int回来迭代器的元素中下标满意条件p的元素。留意:迭代器会跳过这个元素。
24 def isEmpty: Boolean查看it是否为空, 为空回来 true,不然回来false(与hasNext相反)。
25 def isTraversableAgain: BooleanTests whether this Iterator can be repeatedly traversed.
26 def length: Int回来迭代器元素的数量。
27 def map[B](f: (A) => B): Iterator[B]将 it 中的每个元素传入函数 f 后的成果生成新的迭代器。
28 def max: A回来迭代器迭代器元素中最大的元素。
29 def min: A回来迭代器迭代器元素中最小的元素。
30 def mkString: String将迭代器一切元素转换成字符串。
31 def mkString(sep: String): String将迭代器一切元素转换成字符串,并指定分隔符。
32 def nonEmpty: Boolean查看容器中是否包括元素(相当于 hasNext)。
33 def padTo(len: Int, elem: A): Iterator[A]首要回来迭代器一切元素,追加复制 el

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=237

标签: 大数据
分享给朋友:

“Scala语法篇” 的相关文章

c语言数组定义和赋值,C语言数组定义与赋值详解

c语言数组定义和赋值,C语言数组定义与赋值详解

定义数组 一维数组```c// 定义一个整型数组,包含10个元素int arr;``` 二维数组```c// 定义一个整型二维数组,包含3行4列int matrix;``` 初始化数组 一维数组```c// 初始化一个整型数组int arr = {1, 2, 3, 4, 5};``` 二维数组``...

c语言开发工具

1. 集成开发环境(IDE): Visual Studio:微软开发的IDE,支持多种编程语言,包括C语言。它提供了代码编辑、编译、调试、版本控制等功能。 Code::Blocks:一个开源、跨平台的IDE,支持C/C 编程。它轻量级、易于使用,适合初学者。 Eclipse CD...

宏碁蜂鸟swift3,时尚外观与强大性能的完美结合

宏碁蜂鸟swift3,时尚外观与强大性能的完美结合

宏碁蜂鸟Swift 3是一款定位大众化的轻薄笔记本电脑,以下是其主要特点和配置:1. 显示屏: 采用2K分辨率的3:2显示屏,拥有100%sRGB的高色域,显示效果出色。 屏幕实测色域容积为97.3%sRGB,色域覆盖为96.7%sRGB,平均 E为1.2,最大 E为2.81。2. 处理...

python值得学吗,Python值得学吗?——全面解析Python的学习价值与前景

python值得学吗,Python值得学吗?——全面解析Python的学习价值与前景

学习Python是一个很好的选择,原因如下:1. 广泛的应用领域:Python被广泛应用于数据科学、机器学习、人工智能、Web开发、自动化脚本等多个领域。这使得Python成为多面手,可以应对各种不同的编程需求。2. 简洁的语法:Python以其简洁明了的语法著称,使得它非常适合初学者。其语法接近于...

java1.8安装,java18下载官网

java1.8安装,java18下载官网

安装Java 1.8的步骤如下:1. 下载Java 1.8安装包:首先,您需要从Oracle官网下载Java 1.8的安装包。请访问以下链接并选择适合您操作系统的版本进行下载:https://www.oracle.com/java/technologies/javasedownloads.html2...

verilog语言入门教程,verilog语言

如果你想学习Verilog语言,这里有几篇入门教程可以参考:1. 菜鸟教程 Verilog 教程 这篇教程介绍了Verilog HDL的基本语法、设计层次和仿真方法,适合初学者和进阶者。通过实例和代码,你可以学习如何用Verilog设计数字电路,如4位宽10进制计数器。 2. CSDN...