Scala初步(基础篇)

Posted 麦田里的守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala初步(基础篇)相关的知识,希望对你有一定的参考价值。

简介

Scala是一门多范式的编程语言,同时支持面向对象和面向函数编程风格。它以一种优雅的方式解决现实问题。虽然它是强静态类型的编程语言,但是它强大的类型推断能力,使其看起来就像是一个动态编程语言一样。

就像Groovy,Clojure、JRuby等基于JVM虚拟机的编程语言一样,Scala的源码最终是被编译程Java字节,所以由Scala编译好的程序可以无缝的运行在JVM虚拟机之上。甚至你可以使用Scala开发android程序,这也意味着Scala和Java的类库可以相互调用。但是与其他基于JVM的编程语言相比较,Scala优秀的地方在于Scala除了具备面向对象编程的风格之外,Scala还拥有类似Scheme、Standard ML和Haskell一样的函数式编程风格,比如柯里化(Currying)、类型推断、不可变类型、延迟求值、模式匹配等,它还提供了其他的高级特性例如特质、协变和逆变、高阶函数和类型(Higher-order)、lambda等,其他特性如操作符重载、默认参数、命名参数、原始字符串、字符串插值等。 总之,Scala编程语言的好处如下:

面向对象 在Scala编程语言中,一切值都是对象,每一个操作都是方法调用,不像Java中还有int、boolean等基本类型。传动的编程模式也适用于Scala,比如简单的可以通过Object实现,模式匹配可以实现visitor模式。通过隐式类,Scala可以为其他已用的类型增加新方法,即使这些类来自Java(C#很早也添加了这个功能)。隐式方法在Scala库和其他项目(如Kafka)都得到了广泛的应用,极大地扩展了既有类的功能,同时还精简了代码。

函数式编程 Scala还是一种函数式编程语言,而且语法相当方便。这种将面向对象和面向函数编程混合的方式真是一种天才的设计。它还包括了很多你想要的函数编程的功能。面对于熟悉面向对象的开发者而言,同样没有违和感。与其他的函数式语言不同,Scala允许你渐进地使用函数式风格。在你不熟悉函数式编程的情况下,你可以把它看成一门没有分号分割的Java语言。随着对Scala语言的熟悉,你会渐渐喜欢上其简介的函数式风格。

无缝的Java互操作 Scala代码编译成Java的字节码,所有理论上来说,你可以随意地在项目中混用这两种语言,比如在Maven或者SBT管理项目中,他们的代码结构都是类似的。而且代码之间可以相互引用。当然,Java使用Scala生成的类型并不总是非常方便,比如Scala中包含实现方法的特质(Trait),并不能直接编译成Java的接口,所以,有时候Scala项目也会专门提供Java使用的API,如Apache Spark项目。

函数也是对象 在Scala中,函数有类型的,一个函数也是一个对象,有确定的类型。函数拥有一下特性:

  • 1.可以被放在变量和数据结构中。

  • 2.可以当作函数参数。

  • 3.可以当做函数的返回值。

  • 4.可以在运行期间被创建。

趣味性 使用Scala编程是一件享受的事情,Scala语言提供了如此丰富的特性,而且的它的迭代快速不古板迂腐。Scala还在大数据领域得到广泛的应用,如Spark、Kafka等都是使用Scala开发。一些著名的公司如Twitter、Foursquare、Coursera、LinkedIn、Verizon等也在广泛的使用Scala。Scala之父Martin OrderSky瑞士洛桑联邦理工学院的教授,德国人编程语言和代码分析专家。他另外两个知名工作Generic Java和Javac.Martin OrderSky于2001年设计Scala语言,java平台的Scala于2003年底至2004年初推出,该语言的第二个版本v2.0发布于2006年3月,2011年底Martin OrderSky和Akka的作者Jonas Boner一起成立了TypeSafe公司致力于推广Scala.

Scala安装(Windows版本)

Scala 语言可以运行在Window、Linux、Unix、 Mac OS X等系统上。Scala是基于java之上,大量使用java的类库和变量,必须使用Scala之前必须先安装 Java(>1.5版本)。 1)检查JDK版本(JDK安装略)

 
   
   
 
  1. C:\Users\Administrator>java -version

  2. java version "1.8.0_161"

  3. Java(TM) SE Runtime Environment (build 1.8.0_161-b12)

  4. Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

2)下载并安装配置Scala基本环境

访问http://www.scala-lang.org/download/2.13.0-M3.html

Scala初步(基础篇)

下载后双击msi文件,指定安装目录后其他选项一律使用默认配置,安装完毕后需要在windows上配置SCALA_HOME环境变量。

Scala初步(基础篇)

打开CMD命令窗口测试

Scala初步(基础篇)

Scala类型&变量

类型层次结构

正在Scala中所有的value都有一个类型包括值和函数,下图说明了类型层次结构的子集。

Scala初步(基础篇)

Any 是所有类型的超类型,也称为顶级类型。它定义了某些通用方法,如equals, hashCode和toString.Any 有两个直接子类 AnyVal 和 AnyRef.

AnyVal 表示所有的值类型,有九种预定义的值类型,它们是不可为空的。Double, Float, Long, Int, Short, Byte, Char, Unit, 和 Boolean。Unit是一种不带有意义信息的价值类型。一个Unit实例的字面值可以是().所有函数必须返回一些东西,所以有时候Unit是一个有用的返回类.

AnyRef 表示引用类型,所有非值类型都定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型,如果在Java运行时环境的上下文中使用Scala,则AnyRef对应于java.lang.Object。

Nothing 是所有类型的子类型,也称为底部类型。该类型没有值。

Null 该类型是所有引用类型的子类型,该类型有一个关键的字面值null。 下面是一个示例,它演示了字符串,整数,字符,布尔值和函数就像所有其他对象一样都是对象:

 
   
   
 
  1. val list: List[Any] = List(

  2.  "a string",

  3.  732,  // an integer

  4.  'c',  // a character

  5.  true, // a boolean value

  6.  () => "an anonymous function returning a string"

  7. )

  8. list.foreach(element => println(element))

上面定义了List [Any]类型的变量列表。该列表使用各种类型的元素进行初始化,但它们都是scala.Any的实例,因此您可以将它们添加到列表中。这是程序的输出:

 
   
   
 
  1. a string

  2. 732

  3. c

  4. true

  5. $line3.$read$$iw$$iw$$$Lambda$1028/1270823096@36551e97

类型映射

值类型可以通过以下方式转换:

Scala初步(基础篇)

例如:

 
   
   
 
  1. val x: Long = 987654321

  2. val y: Float = x  // 9.8765434E8 (note that some precision is lost in this case)

  3. val face: Char = '☺'

  4. val number: Int = face  // 9786

类型映射是单向的,一下编译器编译出错

 
   
   
 
  1. val x: Long = 987654321

  2. val y: Float = x  // 9.8765434E8

  3. val z: Long = y  // Does not conform

你还可以将引用类型转换为子类型。这将在的后期介绍到。

变量定义

 
   
   
 
  1. var a:Int = 1

  2. var str:String = "hello world"

  3. var pair:(Int,String) = (1,"测试") //元组

  4. var b=1

  5. var i:Int=1

  6. var j=1:Byte

  7. var tuple=(1,2)//元组

注意:上图中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。

算术运算符

算术运算符:+、-、*、/、%、 关系运算符:==、!=、>、<、>=、<= 逻辑运算符:&&、||、! 位运算符:&(按位与)、|(按位或)、^(异或)、~(取反)、<<、>>、>>>(无符号) 赋值运算符:= 、组合赋值:(算术|位运算=)

条件分支&循环控制

if条件分支

 
   
   
 
  1. if(布尔表达式 1){

  2.   // 如果布尔表达式 1 为 true 则执行该语句块

  3. }else if(布尔表达式 2){

  4.   // 如果布尔表达式 2 为 true 则执行该语句块

  5. }else if(布尔表达式 3){

  6.   // 如果布尔表达式 3 为 true 则执行该语句块

  7. }else {

  8.   // 如果以上条件都为 false 执行该语句块

  9. }

while循环控制

 
   
   
 
  1. // 局部变量

  2. var a = 10;

  3. // while 循环执行

  4. while( a < 20 ){

  5.  println( "Value of a: " + a );

  6.  a = a + 1;

  7. }

do-while循环

 
   
   
 
  1. var a:Int = 0

  2. do{

  3.    println( "Value of a: " + a );

  4.    a = a + 1;

  5. }while( a < 20 )

for循环

 
   
   
 
  1. var a = 0;

  2. // for 循环

  3. for( a <- 1 to 10){

  4.  println( "Value of a: " + a );//打印1-10

  5. }

  6. for( a <- 1 until 10){

  7.  println( "Value of a: " + a );//打印1-9

  8. }

for 循环 中你可以使用分号 (;) 来设置多个区间,它将迭代给定区间所有的可能值(实现嵌套)

 
   
   
 
  1. var a = 0;

  2. var b = 0;

  3. for( a <- 1 to 3; b <- 1 to 3){

  4.    println( "Value of a: " + a );

  5.    println( "Value of b: " + b );

  6. }

for循环集合

 
   
   
 
  1. val numList = List(1,2,3,4,5,6);

  2.      // for 循环

  3. for( a <- numList ){

  4.   println( "Value of a: " + a );

  5. }

for循环过滤

 
   
   
 
  1. var a = 0;

  2. val numList = List(1,2,3,4,5,6,7,8,9,10);

  3. // for 循环

  4. for( a <- numList

  5.       if a != 3; if a < 8 ){

  6.          println( "Value of a: " + a );

  7.        }

  8. }

for使用yield

 
   
   
 
  1. var a = 0;

  2. val numList = List(1,2,3,4,5,6,7,8,9,10);

  3. // for 循环

  4. var retVal = for{ a <- numList

  5.               if a != 3; if a < 8

  6.             }yield a

  7. // 输出返回值

  8. for( a <- retVal){

  9.  println( "Value of a: " + a );

  10. }

match-case

Scala中取消了switch-case语法,取而代之的是使用match-case语法,也称为模式匹配。

 
   
   
 
  1. var sex="..."

  2. var alias =sex match {

  3.  case "boy" => "男孩"

  4.  case "girl" => "女孩"

  5.  case default => "怪物"

  6. }

  7. println(alias)

default关键字可以省略使用 -替换.

Break语法 Scala 语言中默认是没有 break 语句,但是你在 Scala 2.8 版本后可以使用另外一种方式来实现 break 语句。当在循环中使用 break 语句,在执行到该语句时,就会中断循环并执行循环体之后的代码块。Scala 中 break 的语法有点不大一样,格式如下:

 
   
   
 
  1. var a = 0;

  2. val numList = List(1,2,3,4,5,6,7,8,9,10);

  3. val loop = new Breaks;      

  4. loop.breakable {

  5.         for( a <- numList){

  6.            println( "Value of a: " + a );

  7.            if( a == 4 ){

  8.               loop.break;

  9.            }

  10.         }

  11.  }

  12. println( "After the loop" );

Scala初步(基础篇)

微信ID:jiangzz_wy

扫描关注一下,拜托拜托啦~

温馨提示

以上是关于Scala初步(基础篇)的主要内容,如果未能解决你的问题,请参考以下文章

为了爱情序幕《Scala基础篇一》

Scala编程语言面试基础篇1

Spark MLlib速成宝典基础篇01Windows下spark开发环境搭建(Scala版)

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Scala学习汇总篇

Scala基础篇