Scala从入门到入土(从入门到放弃)

1 Scala介绍

Scala是一门 综合了 面向对象的 函数式编程的 基于JVm的 语言

特点:
1 语法简洁
2 开发速度快 , 运行速度快
3 兼容 Java 可以访问Java类库
4 很多大数据框架的源码或编程接口都支持Scala
5 使用广泛 国际认可

2 Scala运行环境

运行环境: JDK 8 或者11(长期支持)
ScalaSDK 2.12.11 稳定(或者2.12.12)

3 Scala 基础语法

3.1 声明变量 语法详解

1 Scala语句最后不要加分号
2 Scala中类型可以可以省略,因为Scala编译器 支持类型判断
3 val修饰的修饰的变量不能重新赋值 (类似于Java中的final)
4 var可以重新赋值
5 开发中 常用val
6 可以使用type给类型起别名
7 可以使用lazy修饰变量,延迟变量的初始化

测试: type 给类型起别名 可以用数字吗??? (针对6)
答: 不可以

3.2 数据类型

Any 父类( 类似Java中的 Object )
值类型 Scala中的值类型都是大写开头
Byte
Short
Int
Long
Double
Float
Boolean
Char

String: 定义方式1: " "
定义方式2: “”" 这里面可以写SQL “”"
定义方式3: 字符串拼接可以使用插值表达式
定义方式4: 插值表达式 加 “”" “”"

3.3 操作符

语法详解
Scala中的+ - * / %等操作符的作用与Java一样,
位操作符 & | ^ >> <<也一样。
注意:
1.Scala中的操作符实际上是方法
2.Scala中没有++、–操作符,需要通过+=、-=来实现同样的效果
3.+ - * / %是方法,那么就可以进行操作符重载,完成特殊的运算
(也就是自己在类中定义+ - * / %方法表示特殊的运算)

3.4 块表达式

定义变量时可以使用 {} 包含一系列表达式,其中{}块的最后一个表达式的值就是整个块表达式的值。

3.5条件表达式 :

cala条件表达式的语法和Java一样,只是更加简洁,且Scala中if else表达式是有返回值的

注意:
Scala中没有三元表达式,如果if或者else返回的类型不一样,就返回Any类型,对于没有返回值的,使用Unit,写做(),相当于java中的void

3.6循环表达式:

在scala中,可以使用for循环和while循环,但一般推荐使用for表达式,因为for表达式语法更简洁

● 简单for循环:

for (变量 <- 表达式/数组/集合) {循环体}
for(i <- 1 to 10) println(i)

● 嵌套for循环

 for (变量1 <- 表达式/数组/集合; 变量2 <- 表达式/数组/集合) {循环体}for(i <- 1 to 9; j <- 1 to 9){if(i >= j ) print(s"${j} * ${i} = ${j*i}")if(j == 9) println()}

● 守卫
for表达式中,可以添加if判断语句,这个if判断就称之为守卫。我们可以使用守卫让for表达式更简洁。

 for(i <- 表达式/数组/集合 if 表达式) {循环体}for(i <- 1 to 10 if i % 3 == 0) println(i)

● for推导式
在for循环体中,可以使用yield表达式构建出一个集合,我们把使用yield的for表达式称之为推导式,即可以使用for推导式生成一个新的集合(一组数据)

 //该for表达式会构建出一个集合val l = for(i <- 1 to 10) yield i * 10

● 注意:
while语句本身没有值,即整个while语句的结果是Unit类型的()

 var n = 1;val result = while(n <= 10){n += 1}println(result) //()println(n)  //10

3.7 break和continue

Scala中没有break和continue 关键字来退出循环,如果需要使用break/continue,可以使用scala.util.control.Breaks对象的breakable和break方法。

4 方法

Scala中的方法和Java中的方法一样,都是用来封装某些功能的,他可以接收参数,并在方法体中进行一些处理操作,最后还可以返回处理的结果

定义格式:

 def 方法名(参数名1: 参数类型1, 参数名2: 参数类型2) : 返回类型 = {方法体}

语法细节:
1.方法的返回值类型和return可以不写,编译器可以自动推断出来
2.对于递归方法,必须指定返回类型
3.如果方法没有返回值,返回Unit类型(类似于void,也可以不写)
4.返回值类型有多种情况则返回Any
5.带有默认值参数的方法,调用时,可以给定新值,也可以使用默认值
6.可以通过参数名来指定传递给哪一个参数,
这样传递参数时就可以不按照顺序传递
7.方法没有参数,调用时可以省略(),如果定义时()省略,调用时则必须省略
8.可变参使用 变量名:类型* (类似Java的…)

5 函数

函数的本质是: 对象
(函数就和方法都是用来封装一些操作的)

格式

●完整语法:

val函数名称:(参数类型)=>函数返回值类型=(参数名称:参数类型)=>{函数体}

●简写语法:

val函数名称=(参数名称:参数类型)=>{函数体}//如果只有一行{}可以省略

●符号解释

=  表示将右边的函数赋给左边的变量
=> 左面表示输入参数名称和类型,右边表示函数的实现和返回值类型

证明Scala中的函数本质也是对象

●注意:
严格的来说,函数与方法是不同的东西。定义方式上也有很多的区别,但是在Scala中,函数本身是对象,方法可以通过下划线_转换为函数。

6 集合

集合分类
分类方式

一: 按照集合数据结构分类

Seq序列
Set
Map

二: 按照可变不可变进行分类

不可变集合  scala.collection.immutable (默认)开发时建议Scala优先采用不可变集合 默认即为不可变
可变集合  scala.collection.

数组 Array

●不可变/定长数组:val/var 变量名= new Array[T](数组长度)val/var 变量名 = Array(元素1, 元素2, 元素3...)●可变/变长数组://需要导入import scala.collection.mutable.ArrayBuffer包val/var 变量名 = ArrayBuffer[T]() val/var 变量名 = ArrayBuffer(元素1, 元素2, 元素3...)

list

●不可变列表(默认)
import scala.collection.immutable._创建方式1.使用List(元素1, 元素2, 元素3, ...)来创建一个不可变列表val/var 变量名 = List(元素1, 元素2, 元素3...)创建方式2.使用::方法创建一个不可变列表val/var 变量名 = 元素1 :: 元素2 :: Nil
注意:使用::拼接方式来创建列表,必须在最后添加一个Nil●可变列表
import scala.collection.mutable._
创建方式1.使用ListBuffer[元素类型]()创建空的可变列表val/var 变量名 = ListBuffer[Int]()创建方式2.使用ListBuffer(元素1, 元素2, 元素3...)创建可变列表val/var 变量名 = ListBuffer(元素1,元素2,元素3...)

Set

●Set说明Set代表一个没有重复元素的无序集合;即无法加入重复元素且不保证插入顺序的。●不可变Set(默认)       import scala.collection.immutable._1.创建一个空的不可变集,语法格式:val/var 变量名 = Set[类型]()2.给定元素来创建一个不可变集,语法格式:val/var 变量名 = Set(元素1, 元素2, 元素3...)●可变Set        import scala.collection.mutable._格式相同,导包不同注意:在main方法里导包是导包下面的集合是可变的在首行导包是main方法中的全部 set都是可变的val/var 变量名 = Set[类型]()

Tuple 元组

1.语法详解
元组也是可以理解为一个容器,可以用来存放各种相同或不同类型的数据。
例如:姓名,年龄,性别,出生年月。
元组的元素是不可变的。

●创建元组
方式一:使用括号来定义元组

 val/var 元组 = (元素1, 元素2, 元素3....)

方式二:使用箭头来定义元组(元组只有两个元素)

 al/var 元组 = 元素1->元素2 //对偶/二元组是最简单的元组(k,v)

注意:如果定义二元组使用方式一/二都可以 但是如果是三元组,则需要注意只能用方式2

●获取元组中的值

 使用下划线加脚标 ,例如 tuple._1  tuple._2  tuple._3

注意:元组中的元素脚标是从1开始的

●将对偶(二元组)组成的数组转换成映射(映射就相当于Java中的Map)

将对偶/二元组的集合转换成映射: 调用其toMap 方法

●遍历
可以调用元组的productIterator方法获取迭代器对象进行遍历

2.拉链操作:

使用zip将多个值绑定在一起,如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数, 使用zipAll将多个值绑定在一起,缺少的用默认的元素填充

Map Map是多个二元组
在Scala中,把哈希表这种数据结构叫做映射。类比Java的map集合

●不可变Map

import scala.collection.immutable.Map格式一:  使用箭头     val/var map = Map(键->值, 键->值, 键->值...)      // 推荐,可读性更好格式二:利用元组val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)

●可变Map

import scala.collection.mutable.Map
//与 不可变Map 格式相同,导包不同

●获取值

map(键)
map.getOrElse(键,默认值)

●修改值

map(键)=值

Queue

队列数据存取符合先进先出的策略,有 scala.collection.mutable.Queue 和 scala.collection.immutable.Queue ,一般来说我们在开发中队列通常使用可变队列

●常见操作

         += //追加enqueue //入队dequeue //出队

代码

 package cn.itcast.collection/*** Author caowei* Date 2019/7/3 20:16* Desc */object QueueDemo {def main(args: Array[String]): Unit = {//队列的创建import scala.collection.mutable.Queueval q1 = new Queue[Int]println(q1) //Queue()//队列元素的追加q1 += 1;println(q1)//Queue(1)//向队列中追加Listq1 ++= List(2, 3, 4)println(q1)//Queue(1, 2, 3, 4)//按照进入队列的顺序删除元素q1.dequeue()println(q1)//Queue(2, 3, 4)//塞入数据q1.enqueue(9, 8, 7)println(q1)//Queue(2, 3, 4, 9, 8, 7)//返回队列的第一个元素println(q1.head)//2//返回队列最后一个元素println(q1.last)//7//返回除了第一个以外的元素println(q1.tail)//Queue(3, 4, 9, 8, 7)}}

今日分享这么多, 仅代表个人理解 , 有借鉴部分 有任何疑问或者侵权问题 欢迎咨询 QQ 2211572344 交流探讨

Scala从入门到入土(从入门到放弃)相关推荐

  1. Activiti工作流从入门到入土:入门实例

    一.前言 在上一节中我们对activiti进行了基本的介绍activiti进行了基本的介绍,同时介绍了基本的概念. 这一节,我将用一个入门程序,介绍如何使用activiti. 二.环境准备 2.1.编 ...

  2. 【C语言】从入门到入土(入门篇)

    前言 提问:什么是c语言?吃语言,菜语言? 不不不,饿了就去饭堂哈. C语言是一门面向过程的计算机编程语言. 与C++.Java等面向对象编程语言有所不同,C语言的设计目标是提供一种能以简易的方式编译 ...

  3. (初识C语言p2) C语言从入门到入土(入门篇)

    初识C语言 什么是C语言 第一个C语言程序 数据类型 变量.常量 字符串+转义字符+注释 //以上是上一节讲过的想要观看的小伙伴们可以去看之前的博客哟 目录 初识C语言 6. 选择语句 7. 循环语句 ...

  4. Flink 教程 gitbook 从入门到入土(详细教程)

    Flink从入门到入土(详细教程) 和其他所有的计算框架一样,flink也有一些基础的开发步骤以及基础,核心的API,从开发步骤的角度来讲,主要分为四大部分 1.Environment Flink J ...

  5. rocketmq怎么保证消息一致性_从入门到入土(三)RocketMQ 怎么保证的消息不丢失?...

    精彩推荐 一百期Java面试题汇总SpringBoot内容聚合IntelliJ IDEA内容聚合Mybatis内容聚合 接上一篇:RocketMQ入门到入土(二)事务消息&顺序消息 面试官常常 ...

  6. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)

    文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig 欢迎 star !!! 本来想着闲来无事,前面在项目中刚刚用到了工作流 Activit ...

  7. activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...

    点击上方"好好学java",选择"置顶"公众号 重磅资源.干货,第一时间送达 重磅推荐  ① 纯福利 | 公众号资源大汇总,一年才一次! ② 重磅!!2018年 ...

  8. 从入门到入土(十)RocketMQ集群流程以及核心概念

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群 ...

  9. 从入门到入土(九)手摸手教你搭建RocketMQ双主双从同步集群,不信学不会!...

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:从入门到入土(八)RocketMQ的Consumer是如何做的负 ...

最新文章

  1. Python 过程式编程与函数式编程
  2. python输出日期的模版_python按日期区间生成markdown日记模板
  3. linux嵌入式面试题合集,嵌入式linux面试题解析(一)——ARM部分二
  4. timeshift备份你的Linux系统
  5. 文本分析软件_读书笔记:伍多库卡茨质性文本分析:方法、实践与软件使用指南...
  6. 今年别想了!iPhone 12系列没有120Hz高刷屏
  7. PHP 处理TXT文件(打开/关闭/检查/读取)
  8. imx6 android 最新,【iMX6Q-Android6.0】---移植 iMX6Q android6.0 源码 史上最详细
  9. Linux 2.6.19.x内核编译配置选项简介
  10. 织梦Dedecms源码文件夹目录模板解释说明
  11. 如何用吹风机计算机主机清理,用吹风机吹电脑里的灰尘可以吗?
  12. webRTC H265浏览器播放器+metaRTC推流实现webRTC H265解决方案
  13. 字体在其他浏览器正常在IE8显示字体模糊问题解决
  14. python 条形图填充疏密_python matplotlib模块: fill_between(填充曲线)
  15. 西门子S7-200SMART控制步进电机(五)
  16. VirtualBox VBoxManage修改BIOS信息
  17. 44.Isaac教程--姿态估计
  18. ubuntu IBUS输入法安装和设置
  19. phpcms怎么做专题页面
  20. PCI设备BAR空间的初始化

热门文章

  1. cad字体安装_CAD教程,如何安装CAD字体库,让打开图纸时显示?的现象都消失...
  2. 把MM照片变手绘卡通效果
  3. iris-session梳理
  4. 三极管工作原理_【电子器件】02:三极管工作原理
  5. js调java并传参_Js调用Java方法并互相传参的简单实例
  6. hi3518ev300开发板烧写历程
  7. 百络网警网络监控软件部署方案
  8. Java版色情图像过滤入门示例及源码-0.1.0 (模拟GreenDam过滤机制)
  9. 《人工智能杂记》人工智能时间简史
  10. 浅谈SpaceBuilder系统的缓存机制_缓存思想