scala学习——基础语法

wmx24 wmx24     2022-12-16     263

关键词:

Scala语言是一种面向对象语言,结合了命令式(imperative)和函数式(functional)编程风格,其设计理念是创造一种更好地支持组件的语言。

 

特性

  • 多范式(Multi-Paradigm)编程语言,类似Java、C#;

  • 继承面向对象编程和函数式编程的特性;

    • 面向对象:[1]. 子类继承,[2]. 混入(Mixin)机制;

    • 函数式:支持高阶函数、嵌套函数,模式匹配,支持柯里化(Currying);

    • 类型推断(Type Inference):根据函数体中的具体内容推断方法的返回值类型

  • 更高层的并发模型,可伸缩;

  • 静态类型,编译时检查;

  • 允许与Java互操作(将来会支持与.Net互操作);

与Java对比

  • 如果用作服务器端开发,Scala的简洁、灵活性是Java无法比拟的;

  • 如果是企业级应用开发、Web开发,Java的强大是Scala无法匹敌的;

 

基础语法

表达式(Expressions)

表达式是可计算的语句。您可以使用println输出表达式的结果。

println(1) // 1
println(1 + 1) // 2
println("Hello!") // Hello!
println("Hello," + " world!") // Hello, world!

 

值(Values)

您可以使用val关键字命名表达式的结果。

val x = 1 + 1
println(x) // 2

命名结果(例如x)称为值。引用值不会重新计算它。值无法被重新分配。

val x = 1 + 1
x = 3 // This does not compile.

可以推断出值的类型,但您也可以显式声明类型,如下所示:

val x: Int = 1 + 1

注意类型声明Int如何在标识符x之后出现,你还需要一个“:”

 

变量(Variables)

变量就像值,除了你可以重新赋值。您可以使用var关键字定义变量。

var x = 1 + 1
x = 3 // This compiles because "x" is declared with the "var" keyword.
println(x * x) // 9

与值一样,您可以根据需要明确说明类型:

var x: Int = 1 + 1

 

块(Blocks)

您可以通过用包围表达式来组合表达式。我们称之为块。块中最后一个表达式的结果也是整个块的结果。

println(
  val x = 1 + 1
  x + 1
) // 3

 

函数(Functions)

函数是带参数的表达式。

您可以定义一个返回给定整数加一的匿名函数(即无名称):

(x: Int) => x + 1

在=>的左边是参数列表。右边是涉及参数的表达式。

您也可以命名函数。

val addOne = (x: Int) => x + 1
println(addOne(1)) // 2

函数可能需要多个参数。

val add = (x: Int, y: Int) => x + y
println(add(1, 2)) // 3

或者它不需要参数。

val getTheAnswer = () => 42
println(getTheAnswer()) // 42

 

方法(Methods)

方法的外观和行为与函数非常相似,但它们之间存在一些关键差异。

方法使用def关键字定义。 def后跟名称,参数列表,返回类型和正文。

def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3

注意如何在参数列表和冒号之后声明返回类型:Int。

方法可以采用多个参数列表。

def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9

或者根本没有参数列表。

def name: String = System.getProperty("user.name")
println("Hello, " + name + "!")

还有一些其他差异,但就目前而言,您可以将它们视为与函数类似的东西。

方法也可以有多行表达式。

def getSquareString(input: Double): String = 
  val square = input * input
  square.toString

正文中的最后一个表达式是方法的返回值。 (Scala确实有一个return关键字,但它很少使用。)

关于方法(Method)和函数(Function)

  • 函数是一等公民,使用val语句可以定义函数,def语句定义方法;

  • 函数是一个对象,继承自FuctionN,函数对象有curried,equals,isInstanceOf,toString等方法,而方法不具有;

  • 函数是一个值,可以给val变量赋值,方法不是值、也不可以给val变量赋值;

  • 通过将方法转化为函数的方式 method _ 或 method(_) 实现给val变量赋值;

  • 若 method 有重载的情况,方法转化为函数时必须指定参数和返回值的类型;

  • 某些情况下,编译器可以根据上下文自动将方法转换为函数;

  • 无参数的方法 method 没有参数列表(调用:method),无参数的函数 function 有空列表(调用:function());

  • 方法可以使用参数序列,转换为函数后,必须用 Seq 包装参数序列;

  • 方法支持默认参数,函数不支持、会忽略之;

 

类(Classes)

您可以使用class关键字定义类,后跟其名称和构造函数参数。

class Greeter(prefix: String, suffix: String) 
  def greet(name: String): Unit =
    println(prefix + name + suffix)

方法greet的返回类型是Unit,它表示返回没有任何意义。它与Java和C中的void类似地使用。(不同之处在于,因为每个Scala表达式必须具有某个值,实际上存在Unit类型的单例值,write()。它不携带任何信息。)

您可以使用new关键字创建类的实例。

val greeter = new Greeter("Hello, ", "!")
greeter.greet("Scala developer") // Hello, Scala developer!

 

样本类(Case Classes)

Scala有一种特殊类型的类,称为样本类。默认情况下,样本类是不可变的,并按值进行比较。您可以使用“case class”关键字定义案例类。

case class Point(x: Int, y: Int)

您可以在没有new关键字的情况下实例化样本类。

val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)

并且它们按值进行比较。

if (point == anotherPoint) 
  println(point + " and " + anotherPoint + " are the same.")
 else 
  println(point + " and " + anotherPoint + " are different.")
// Point(1,2) and Point(1,2) are the same.
?
if (point == yetAnotherPoint) 
  println(point + " and " + yetAnotherPoint + " are the same.")
 else 
  println(point + " and " + yetAnotherPoint + " are different.")
// Point(1,2) and Point(2,2) are different.

 

对象(Objects)

对象是它们自己定义的单个实例。你可以把它们想象成自己班级的单身人士。

您可以使用object关键字定义对象。

object IdFactory 
  private var counter = 0
  def create(): Int = 
    counter += 1
    counter
  

您可以通过引用其名称来访问该对象。

val newId: Int = IdFactory.create()
println(newId) // 1
val newerId: Int = IdFactory.create()
println(newerId) // 2

 

抽象类

你可以定义一个抽象类,它定义了一些方法但没有实现它们。取而代之是由扩展抽象类的子类定义这些方法。你不能创建抽象类的实例。

abstract class Shape       
  def getArea():Int    // subclass should define this      
 
class Circle(r: Int) extends Shape       
  def getArea():Int =  r * r * 3       
 
val s = new Shape //error: class Shape is abstract; cannot be instantiated                     
val c = new Circle(2)

 

特质(Traits)

特质是包含某些字段和方法的类型。可以组合多种特质。
您可以使用trait关键字定义特质。

trait Greeter 
  def greet(name: String): Unit

特质也可以有默认实现。

trait Greeter 
  def greet(name: String): Unit =
    println("Hello, " + name + "!")

您可以使用extends关键字扩展traits并使用override关键字覆盖实现。

class DefaultGreeter extends Greeter
?
class CustomizableGreeter(prefix: String, postfix: String) extends Greeter 
  override def greet(name: String): Unit = 
    println(prefix + name + postfix)
  
?
val greeter = new DefaultGreeter()
greeter.greet("Scala developer") // Hello, Scala developer!
?
val customGreeter = new CustomizableGreeter("How are you, ", "?")
customGreeter.greet("Scala developer") // How are you, Scala developer?

在这里,DefaultGreeter只扩展了一个特质,但它可以扩展多个特质。

什么时候应该使用特质而不是抽象类?

如果你想定义一个类似接口的类型,你可能会在特质和抽象类之间难以取舍。这两种形式都可以让你定义一个类型的一些行为,并要求继承者定义一些其他行为。一些经验法则:

  • 优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。

  • 如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而特质不行。例如,你不能说trait t(i: Int) ,参数i是非法的。

 

Main方法

Main方法是程序的切入点。 Java虚拟机需要将main方法命名为main,并使用一个参数,即一个字符串数组。
使用对象,您可以按如下方式定义main方法:

object Main 
  def main(args: Array[String]): Unit =
    println("Hello, Scala developer!")

 

本文主要翻译自Basics|Scala Documentation



大数据学习06scala的基础语法(代码片段)

大数据学习06Scala的基础语法介绍Scala的基础语法文章目录大数据学习06Scala的基础语法前言一、注释二、变量与常量1.基本语法2.代码实操三、标识符的命名规范1.命名规范2.字符串输出3.调试效果四、控制台标准输入1.代码实现2.调... 查看详情

scala学习笔记一之基础语法,条件控制,循环控制,函数,数组,集合

...:http://www.cnblogs.com/biehongli/p/8065679.html1:Scala之基础语法学习笔记:1:声明val变量:可以使用val来声明变量,用来存放表达式的计算结果,但是常量声明后是无法改变它的值的,建议使用val来声明常量;声明var变量:如果要声明可以... 查看详情

scala函数式编程scala基础语法介绍

...java或者python的基础,毕竟大部分人不会将scala当作第一门学习编程的语言。不过这些语法知识记不住也没关系,本身语法这种东西就应该在使用中被记住。这里写这篇的目的也只是梳理一遍,方便大家对语法有个 查看详情

scala的基础用法和java相对应学习变量循环语法

一、配置相关环境1.增加项目在idea里面创建新的maven项目2.在pom文件中增加依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi= 查看详情

scala基础语法之trait详解(代码片段)

▼Scala系列学习笔记:Scala概述与开发环境配置Scala基础学习之运算符Scala基础学习之for循环和while循环一文掌握scala中的方法和函数Scala基础:类和对象、访问修饰符和构造器Scala的继承和抽象类本章节目标能够使用trait独... 查看详情

spark记录-scala基础语法

如果您熟悉Java语言语法和编程,那么学习Scala将会很容易。Scala和Java之间最大的句法差异在于行结束字符的分号(;)是可选的。当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。现在我们简单地看一... 查看详情

scala学习之一scala基础语法(代码片段)

环境  虚拟机:VMware10  Linux版本:CentOS-6.5-x86_64  客户端:Xshell4  FTP:Xftp4  jdk1.8  scala-2.10.4(依赖jdk1.8) spark-1.6Scala是一种混合功能编程语言,类似java,运行于JVM,集成面向对象编程和函数式编程的各种特性。(1)Scala... 查看详情

spark基础学习笔记12:scala内建控制结构

文章目录零、本讲学习目标一、条件表达式(一)语法格式(二)执行情况(三)案例演示任务1、根据输入值的不同进行判断任务2、编写Scala程序,判断奇偶性二、块表达式(一)语法格式ÿ... 查看详情

scala简介及基础语法(代码片段)

...和函数式编程的特点。运行在JVM(jdk)。大数据中为什么学习scala?spark是scala语言编写。python写spark挺好的java写spark很糟糕(代码实在是太多了)scala写spark很完美二、scala特点1)优雅框架设计中第一个要考虑的问题就是API是否优雅。... 查看详情

scala基础语法

如果你之前是一名Java程序员,并了解Java语言的基础知识,那么你能很快学会Scala的基础语法。Scala与Java的最大区别是:Scala语句末尾的分号;是可选的。我们可以认为Scala程序是对象的集合,通过调用彼此的方法来实现消息传递。... 查看详情

大数据scala学习—列表集与映射

▼Scala系列学习笔记:Scala概述与开发环境配置Scala基础学习之运算符Scala基础学习之for循环和while循环一文掌握scala中的方法和函数Scala基础:类和对象、访问修饰符和构造器Scala的继承和抽象类Scala基础语法之Trait详解Scala... 查看详情

大数据scala学习—列表集与映射

▼Scala系列学习笔记:Scala概述与开发环境配置Scala基础学习之运算符Scala基础学习之for循环和while循环一文掌握scala中的方法和函数Scala基础:类和对象、访问修饰符和构造器Scala的继承和抽象类Scala基础语法之Trait详解Scala... 查看详情

scala基础语法(代码片段)

Scala-HelloWorld目标,在本地启动一个项目,能够输出helloworldhttps://www.scala-lang.org/官网提供的下载安装方式有很多种。推荐IDE:IDEA和VSCode这里我安装了IDEA,就用了它。创建scala文件的时候,提示安装Scala插件,点击安装写完helloworld... 查看详情

scala基础语法(代码片段)

Scala基础1、声明变量packagecn.gec.scalaobjectVariableDemo defmain(args:Array[String])   //使用val定义的变量值是不可变的,相当于java里用final修饰的变量   vali=1   //使用var定义的变量是可变得, 查看详情

scala基础语法(代码片段)

目录1.java语法类比Scala基本语法需要注意以下几点:2声明变量2.1语法格式2.2在解释器中定义一个变量2.3val和var变量2.4使用类型推断来定义变量2.5惰性赋值3字符串3.1使用双引号3.2使用插值表达式3.3使用三引号4数据类型与操作... 查看详情

大数据学习之scala语言基本语法学习36

...和函数式编程的特点。运行在JVM(jdk)。大数据中为什么学习scala?spark是scala语言编写。python写spark挺好的java写spark很糟糕(代码实在是太多了)scala写spark很完美二:scala特点1)优雅框架设计中第一个要考虑的问题就是API是否优雅。... 查看详情

scala语法学习手册

1      快速入门...21.1            分号...21.2             查看详情

scala常用基础语法总结

1、在spark中如果没有为一个表达声明变量,默认为res。比如:scala>1+1res0:Int=2在实际开发中你常会看到如下代码Try(............)matchcaseSuccess(res)=>rescaseFailure(e)=>logger.error(s"line#$line.mkStr 查看详情