scala课后总结(1)

发布于:2025-03-28 ⋅ 阅读:(28) ⋅ 点赞:(0)

 scala简介

Scala 是 “Scalable Language” 的缩写 ,是一门多范式(multi - paradigm)编程语言

它不像一些语言只专注于一种编程风格(如单纯的面向对象或函数式),而是融合了面向对象编程和函数式编程的特性,能让开发者根据需求灵活选择合适的编程方式。

scala特性

Scala 是一种高度表达性的编程语言,它结合了面向对象编程和函数式编程的最佳特性。

运行基础:Scala 运行在 Java 虚拟机(JVM)上。

兼容优势:Scala 源代码会被编译成 Java 字节码,这使得它能与现有的 Java 程序很好地兼容。

起源与发展

Scala 由 Martin Odersky 等人在 2003 年开发 ,并于 2004 年首次发布 。经过多年发展,在大数据领域(如 Apache Spark 大量使用 Scala 开发)等场景中得到广泛应用,逐渐成为一门重要的编程语言。

面向对象特性:

类和对象:和传统面向对象语言类似,Scala 支持定义类,在类中定义属性(字段)和方法,也能创建对象并调用其方法 。

继承和多态:允许创建类的继承体系,子类继承父类的属性和方法,并且可以重写父类方法实现多态 。

抽象类和特质(traits):抽象类用于定义一些抽象方法,让子类去实现。

封装:通过  public  (公开,任何地方都能访问 )、 protected  (受保护,子类和同一包下可访问 )、 private  (私有,仅在类内部可访问 )等访问控制修饰符,对类的属性和方法进行封装,保证数据的安全性和程序的健壮性 。

函数式编程特性:

高阶函数:函数可以作为参数传递给其他函数,也可以作为函数的返回值 。

不可变性:Scala 中默认使用不可变数据结构,如  val  定义的变量不可重新赋值,不可变集合等。

模式匹配:强大的模式匹配功能可以根据数据结构的不同形态进行条件判断,常用于处理复杂数据结构,如对不同类型的对象进行分类处理 。

闭包: 支持闭包,可以捕获并记住其创建时的变量。

类型系统

 

静态类型:Scala采用静态类型,在编译阶段检查类型,确保代码的安全性和一致性。比如,若将字符串赋值给预期为整数的变量,编译时就会报错。

特性:

泛型类:允许定义通用类,可用于多种数据类型,提升代码复用性。例如定义 List[T] , T  可代表不同类型。

协变和逆变:协变使子类类型可用于父类类型预期处,逆变则相反。比如在函数参数类型处理上,逆变可灵活适配。

标注:用于显式指定类型信息,增强代码可读性和类型检查准确性。

类型参数的上下限约束:可限定类型参数的取值范围,如限定类型参数必须是某个类的子类或父类 。

把类别和抽象类型作为对象成员:能在对象中使用类别和抽象类型,丰富对象的类型表达 。

复合类型:可组合多种类型形成新类型,满足复杂场景需求。

引用自己时显式指定类型:在特定场景明确自身类型,确保类型使用的准确性。

视图:用于类型间的隐式转换,提供更灵活的类型操作方式。

多态方法:同一方法名可根据不同类型参数有不同实现,体现多态性。

类型推断:编译器能自动推断表达式类型,减少类型声明。例如 val num = 10  ,编译器可推断 num  为 Int  类型。

泛型编程:通过泛型编写通用代码,如通用的集合操作算法,适用于不同数据类型。

类型系统扩展:协变、逆变可灵活处理类型层次结构;特质混入可组合不同类型功能。

扩展性

操作符灵活使用:方法可当作前缀或后缀操作符,让代码语法更灵活。

自动构造闭包:根据预期类型自动构建闭包,方便函数式编程中处理匿名函数等场景。

并发性

Akka框架:基于Actor模型,将应用拆分为多个独立Actor进行消息通信,构建高并发、分布式且容错的应用 。

Futures和Promises:提供异步编程抽象,处理异步任务结果,管理并发任务的执行流程。

并发集合:如 ConcurrentHashMap  等,提供线程安全的数据结构,方便在多线程环境下操作数据。

强大的标准库

集合框架:提供丰富的可变和不可变集合类型,如 List  有序列表、 Set  无重复元素集合、 Map  键值对集合等。

字符串处理:支持强大的字符串操作,如拼接、截取、替换,以及正则表达式匹配查找等。

IO操作:涵盖文件读写(如读取文件内容、写入文件 )、网络IO(如Socket通信 )等功能。

与Java互操作性

无缝调用:Scala代码能直接调用Java代码,反之Java代码也能调用Scala代码,方便在项目中混合使用。

利用Java标准库:可使用Java庞大的标准库和框架,借助Java丰富生态加速开发。

模块化和可扩展性

特质(Traits): 可以混入类中,提供类似多重继承的功能,增强代码复用性。

·隐式转换和参数: 支持隐式转换和隐式参数,增强代码的灵活性和可扩展性。

Scala语言的特点:

 

优雅

强调对于框架设计师而言,API的优雅性至关重要 ,因为框架面向应用开发程序员,优雅的API能提升用户体验。Scala在语言设计和API设计上注重简洁、直观与一致性,比如其函数式编程和面向对象编程融合的语法,相比一些语言更简洁优雅,降低学习和使用成本。

速度快

表达能力强:Scala具备丰富语法特性和强大类型系统,一行Scala代码能实现Java多行代码的功能。例如在集合操作中,Scala通过高阶函数简洁处理复杂逻辑,Java则需更多样板代码。

静态编译:Scala属于静态编译语言,在编译阶段进行类型检查等优化,提前发现错误,生成高效字节码,运行时性能表现出色。

能融合到Hadoop生态圈

Hadoop是大数据领域重要标准,Spark基于Scala开发且与Hadoop紧密集成,并非取代Hadoop,而是完善其生态。Scala能与Hadoop生态组件良好协作,是大数据开发的重要语言。

学习基础作用

Scala是学习Spark和Kafka等大数据技术的基础。Spark核心API用Scala编写,Kafka部分客户端也支持Scala,掌握Scala有助于深入理解和使用这些大数据工具。


Scala 基础语法

Scala与Java语法差异

对于有Java基础的程序员,Scala基础语法较易上手。Scala与Java的显著差异在于,Scala语句末尾的分号是可选的。比如在Java中 System.out.println("Hello");  分号不可或缺,而Scala里 println("Hello")  分号可省略。

关键概念

对象:具有属性和行为,是类的实例。

类:是对象的抽象模板,对象是类的具体实例。

方法:描述对象的基本行为,一个类可包含多个方法 。

字段:每个对象独有的实例变量集合,通过给字段赋值创建对象属性。

第一个Scala程序

交互式编程:无需创建脚本文件,在命令行输入 scala  进入交互式环境,可直接输入表达式求值,输入 1+1  会返回结果 2  ,输入 println("Hello World!")  会打印 Hello World!  。

脚本形式:通过创建 .scala  文件编写代码。文档给出 HelloWorld.scala  示例,定义 HelloWorld  对象,其中 main  方法是程序入口, println("hello world")  用于在控制台输出 hello world  。

基本语法

大小写敏感:Scala严格区分大小写, Hello  和  hello  代表不同含义。在定义变量、函数、类等标识符时,必须严格注意大小写,否则会导致编译器无法识别。

类名命名:类名的首字母需大写 ,若由多个单词组成,每个单词首字母都大写,如 class MyFirstScalaClass  

方法名称:方法名首字母小写 ,多个单词组成时,从第二个单词起首字母大写,像 def myMethodName()  。这是Scala代码风格的约定,有助于代码的统一和规范。

程序文件名:传统上,程序文件名应与对象名称完全匹配(区分大小写),并以 .scala  为扩展名 。

程序入口: def main(args: Array[String])  是Scala程序的强制入口方法 ,程序从这里开始执行, args  用于接收命令行参数。

标识符规则

组成形式:可由字符数字和符号组成。字符数字形式需以字母或下划线开头,后续可跟字母、数字 , $  在Scala中视作字母,但以 $  开头的标识符多为编译器保留,应用程序应避免使用,防止冲突。

命名规则:采用类似Java的驼峰命名法 ,普通标识符首字母小写,如 toString  ;类名首字母大写。同时应避免使用以下划线结尾的标识符,防止冲突。

符号标识符:包含一个或多个符号,如 +  、 :  、 ?  等 。Scala内部实现某些符号功能时会使用转义标识符,例如 ->  用 $colon$minus$greater  表示,在Java代码中访问Scala的 ->  方法时需用此内部名称。

混合标识符:由字符数字标识符后跟一个或多个符号组成 ,如 unary_+  是Scala对 +  方法内部实现的名称。字面量标识符用反引号包裹字符串表示,如 Thread.`yield`()  ,用于避免与Scala关键字冲突,像 yield  是关键字,访问 Thread.yield()  方法时要用。

Scala注释

单行注释:以 //  开头,该行 //  后的内容为注释,编译器会忽略 。

多行注释:以 /*  开始, */  结束,其间内容为注释,可跨行 。多行注释可嵌套,但要注意开始和结束符号正确对应。

空行和空格

若一行中仅有空格或包含注释,Scala将其视为空行并忽略。在代码中,标识符等标记可由空格或注释分隔,空格用于增强代码可读性

换行符

Scala是面向行的语言,语句可以用分号结束,也可用换行符分隔。一般情况下,语句末尾分号可选 。

Scala包

定义包:

第一种方式:和Java类似,在文件开头使用 package  关键字定义包名,后续代码都属于该包 ,例如 package com.runoobclass.HelloWorld  。

第二种方式:类似C# ,使用大括号包裹类等定义,可在一个文件中定义多个包,如 package com.runoob { class HelloWorld }  。

引用包:使用 import  关键字引用包。比如 import java.awt.Color  引入 Color  类; import java.awt._  引入 java.awt  包内所有成员 。 import  语句位置灵活,不局限于文件顶部,其作用范围从声明处延伸到所在代码块结束,能减少名称冲突。