spark快速开发之scala基础之1 数据类型与容器
写在前面
面向java开发者。实际上,具有java基础学习scala是很容易。java也可以开发spark,并不比scala开发的spark程序慢。但学习scala可有助于更快更好的理解spark。比如spark的很多算子group,filter之类的,全都是scala语言本身所具备的功能。再比如,想做一个更高级别的spark开发者,势必需要了解spark源码。哪怕不需要通读,但也需要了解scala语言。
快速入门的意思先具备一个宏观上的系统而整体的把控,然后再到这个框架上去把血肉丰满。从阅读源码的角度来说,作为一个java开发者,在数据类型和容器,控制语句等方面,哪怕不会写,至少能大致读懂。但涉及到更高层次的高阶函数,就很头痛了。
比如list。只会讲声明,增删查改以及循环。就能满足大多数情况下的开发。至于其它的功能,通过查看文档,或者源码,就可以搞懂。涉及到像增这一块,比如添加一个元素,list有【++: ++ +: :+ :: ::: :\】等很多功能。但本文只涉及最简单的东西。总之,这是一个简易版的入门。后续的学习不能停止
数据类型
scala数据类型与java基本类似。scala在面向对象方面,比java列我彻底。java有8种基本数据类型,在scala里面全是对象。
| Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
| Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
| Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
| Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
| Float | 32位IEEE754单精度浮点数 |
| Double | 64位IEEE754单精度浮点数 |
| Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
| Boolean | true或false |
其它常见数据类型:
| Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
| Null | null 或空引用 |
| Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。 |
| Any | Any是所有其他类的超类 |
| AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
变量
在 Scala 中,使用关键词 "var" 声明变量,使用关键词 "val" 声明常量。
声明变量实例如下:
var myVar : String = "Foo"
var myVar : String = "Too"
以上定义了变量 myVar,我们可以修改它。
声明常量实例如下:
val myVal : String = "Foo"
以上定义了常量 myVal,它是不能修改的。如果程序尝试修改常量 myVal 的值,程序将会在编译时报错。
变量声明不一定需要初始值,以下也是正确的:
var myVar :Int;
val myVal :String;
变量类型引用
在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。
所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。
var myVar = 10;
val myVal = "Hello, Scala!";
以上实例中,myVar 会被推断为 Int 类型,myVal 会被推断为 String 类型。
Scala 多个变量声明
Scala 支持多个变量的声明:
val xmax, ymax = 100 // xmax, ymax都声明为100 集合 list
//定义
var list = List("spark","hadoop","storm")
var nums = List("sdf","spark")
val empty : List[Nothing] = List() val list2 = list.+:("sdf")//在头部添加元素
println(list2)
val list3 = list.++(nums)//合并两个集合
println(list3)
val list4 = list.:+("sdf")//在尾部添加元素
println(list4) val item = list take 3 //取前几个元素
val head = list.head//取第一个元素
val last = list.last//取最后一个元素 list.updated(1, "mr")//更新 //循环
list.foreach(println)
list.map(println)
数组
大体与list相当
//array
val array : Array[Any] = Array("spark","hadoop","storm")
println(array)
val array2 : Array[String] = Array("spark2","hadoop2")
array.foreach(println)
println(array(0))//取值
println(array.apply(0))//取值
val array3 = array.++:(array2)
println("================")
array3.foreach(println)//循环
val array4 = array.+:("spark").:+("hadoop")//加值
println("================")
array4.foreach(println) val array5 = array.++(array2) array5.foreach(print) //seq
val seq = Seq("hadoop","spark")
println(seq)
map
Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。
默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map类
var map = Map("spark"->1,"hadoop"->"1")
val map2 = Map("spark2"->1,"hadoop2"->"1")
val map3 = map.+(("storm"->1))//添加一个元素
map += ("storm"->1)//添加一个元素
val map4 = map.++(map2)//合并两个集合
println(map4)
map.contains("spark")//判断一个元素是否存在
map.isEmpty//是否为空
//得到key集合
val keys2 : Iterable[String] = map.keys
val keys : Set[String] = map.keySet
val iter : Iterator[String] = map.keysIterator
set
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。
Scala 集合分为可变的和不可变的集合。
默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。
val set = Set("spark","spark","hadoop")
set += "storm" //异常
val mutableSet : Set[String] = Set("spark","spark","hadoop")
mutableSet += "hive"
println(mutableSet)
mutableSet.add("scala")
println(mutableSet)
mutableSet.remove("scala")
println(mutableSet)
mutableSet -= "hive"
println(mutableSet)
spark快速开发之scala基础之1 数据类型与容器的更多相关文章
- spark快速开发之scala基础之5高阶函数,偏函数,闭包
高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...
- spark快速开发之scala基础之3类,对象,特征
类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...
- spark快速开发之scala基础之2控制流程
判断结构 大体与java相当.scala没有三元表达式. val num = if(1>0) 1 else 0 //相当于匿名函数 println(num) var num2 = 0 if(1& ...
- Android Studio快速开发之道
概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...
- iOS 开发之 GCD 基础
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- ios开发之OC基础-类和对象
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- ios开发之OC基础-oc小程序
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- ios开发之OC基础-ios开发学习路线图
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- Hybrid App开发之JavaScript基础
前言: 前面学习了html和css的基本使用,今天开始学习JavaScript的使用. 什么是JavaScript JavaScript是一种基于对象(Object)和事件驱动(Event Drive ...
随机推荐
- ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters
上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameters 我不理解为何 ROS wiki 要把service与parameter放在一起介绍, 很想分 ...
- 【sql小坑】在group by里用select字段的别名?
背景 -- 求每个用户的拥有的产品数,其中userid需要简单split出来 SELECT split (id, '-') [ 0 ] AS userid, count(DISTINCT produc ...
- 8.2.优化SQL语句
8.2.优化SQL语句 数据库应用程序核心操作逻辑都是通过执行SQL语句来执行,不管是直接通过解释器还是通过后台API提交. 调优手册里面的这一节内容帮助各种各样MySQL程序加快速度.手册包括SQL ...
- 2.App爬取相关库的安装(安装mitmproxy)
mitmproxy 是一个支持HTTP 和HTTPS 的抓包程序,类似fiddler,Charles的功能(它通过控制台的形式操作). mitmproxy 两个关键的组件:mitmdump 和 mit ...
- Nop常用知识点
1.列表标题与内容均居中对齐,列中配置为: headerAttributes: { style: "text-align:center" }, attributes: { styl ...
- python中的popitem
popitem()随机删除字典中的任意键值对,并返回到元组中 1 a = { 2 "name":"dlrb", 3 "age":25, 4 ...
- rem布局js实现
(function(designWidth, maxWidth) { var doc = document, win = window; var docEl = doc.documentElement ...
- spring boot 整合redis --sea 方式1
application.properties # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服 ...
- Spring.net介绍及MVC中应用
Spring.net两大核心内容: IOC(控制反转) 传统的面相对象思维模式是对象A依赖对象B,对象B的实例化和调用都在对象A中发生,一旦对象B中发生变化,对象A也要随之变化,这样使得程序间行程了紧 ...
- 利用strstr和sscanf解析GPS信息
比如说我们要做一个GPS导航的项目,需要读取GPS模块以ASCII码的形式发送过来的数据,然后对这些数据进行处理,提取我们需要的信息.这就涉及到很多操作字符串的问题.下面就以此为例,利用strstr函 ...