Scala解析器的使用

  1. REPL:Read(取值)-> Evaluation(求值)-> Print(打印)->Loop(循环)。scala解析器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM执行
  2. val result = 1 设置变量不可变
  3. var result = 2 可变的变量
  4. val name: String = null 声明变量类型
  5. val name: Any = "leo"
  6. val name1,name2:String = null 声明多个变量
  7. val num1,num2=100

数据类型与操作符

  1. 基本数据类型:Byte、Char、Short、Int、Long、Float、Double、Boolean
  2. scala没有基本数据类型与包装类型的概念,统一都是类
  3. 使用以上类型,直接就恶意调用大量的函数,例如,1.toString(),1.to(10)
  4. 在scala中,操作符比如+-*/%&|^>><<等其实是数据类型的函数,比如1+1可以写作1.+(1);例如1.to(10) 又可以写作1 to 10
  5. scala中没提供++、--操作符,只能用+=和-=。比如counter=1,counter++是错误的,必须写作counter+=1

函数调用与apply()函数

  1. 函数调用,不需要传递参数,允许调用函数时省略括号,例如:"Hello World".distinct
  2. apply函数
    • Scala中使用类名()的形式其实就是类名.apply()的缩写,来创建类对象,而不是new 类名()的方式
    • 例如"Hello World"(6)因为StringOps类中有def apply(n: Int):Char的函数定义,所以"Hello World"(6),实际上是"Hello World".apply(6)的缩写

条件控制与循环

  1. if(age > 19) 1 else 8 存在返回值
  2. if(age > 18) "adult" else 0 当返回值类型不同,会取公共父类型Any

输入输出

  1. val name = readLine("Welcome to House")
  2. val age = readInt()
  3. for(i <-1 to n) print(i)
  4. for(i <-1 until n) println(i) 表示不达到上限
  5. for(c <- "Hello World") print(c) 对字符串遍历,类似于java增强for循环
for(i <- 1 to 9;j <- 1 to 9){
if(j==9){
println(i*j)
}else{
print(i*j+" ")
}
}

函数入门

  1. 定义函数,age为返回值
def sayHello(name:String,age: Int) = {
if(age > 19) {
printf("hi %s,you are a big boy\n",name)
age
}else{
printf("hi ,%s,you are a children\n",name)
age
} }
def sum(n:Int) = {
var result = 0
for( i<- 1 to n){
result += i
}
result
}
def fab(n: Int): Int = {
if(n <= 0) 1
else fab(n-1)+fab(n-2)
}

函数默认参数

  1. 默认参数
def sayHello(firstName:String,middleName:String = "",lastName:String="") = firstName + " " +middleName+" "+lastName
  1. 带名参数调用,可以不按顺序
sayHello(firstName="hahha",middleName="xxx",lastName="ggg")

变长参数

def sum(nums: Int*)={
var result = 0
for(num <- nums){
result += num
}
result
}
sum(1 to 5: _*) //值为15,表示取出1到5的整数相加
def sum2(nums:Int*):Int = {
if(nums.length == 0) 0
else nums.head + sum2(nums.tail: _*)
}

lazy值和异常

//定义过程,不会有返回值
def sayHello(name:String):Unit = "Hello,"+name
lazy val lines = fromFile("/home/1.text").mkString
//使用的时候才会执行上面这句
print(lines)

异常

try{
throw new lllegAlrgumentException("x should not be negative")
}catch{
case_:lllegAlrgumentException => print("sorry,error")
}finally{
print("release io ")
}

数组操作之Array、ArrayBuffer以及遍历数组

  1. val a = new ArrayInt
  2. a(0) = 1给元素赋值
  3. val a = Array("hello","world")
  4. import scala.collection.mutable.ArrayBuffer
  5. var b = ArrayBufferInt
  6. b += (2,3,4,5)
  7. 结果b.type = ArrayBuffer(1,2,3,4,5)
  8. b++=ArrayBuffer(6,7,8,9,10)
  9. 结果b.type = ArrayBuffer(1,2,3,4,5,6,7,8,9,10)
  10. b.trimEnd(5)
  11. b的结果去掉后5位
scala> b.insert(1,2,2,3)

scala> b
res20: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> b.insert(1,1,2,9) scala> b
res22: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> b.insert(1,7,8) scala> b
res24: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 7, 8, 1, 2, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> b.remove(1)
res25: Int = 7 scala> b
res26: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 8, 1, 2, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> b.remove(1,3) scala> b
res29: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) //互相转换
scala> b.toArray
res30: Array[Int] = Array(1, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> b.toBuffer
res31: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 9, 2, 2, 3, 2, 3, 5, 5, 6, 9, 8) scala> for(i <- 0 until b.length) print(b(i))
192232355698
//跳跃遍历
scala> for(i <- 0 until (b.length,2)) print(b(i))
123359
//从尾部遍历
scala> for(i <- (0 until b.length).reverse) print(b(i))
896553232291
//增强for循环
scala> for(i <- b) print(i)
192232355698 scala> val b = Array(9,8,2,2,3,4)
b: Array[Int] = Array(9, 8, 2, 2, 3, 4) scala> scala.util.Sorting.quickSort(b) scala> b
res3: Array[Int] = Array(2, 2, 3, 4, 8, 9) scala> b.mkString
res5: String = 223489 scala> b.mkString(",")
res6: String = 2,2,3,4,8,9 scala> b.toString
res7: String = [I@6d4502ca

yield

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5) scala> val a2 = for(ele <- a) yield ele * ele
a2: Array[Int] = Array(1, 4, 9, 16, 25) scala> val a3 = for(ele <- a if ele % 2==0) yield ele * ele
a3: Array[Int] = Array(4, 16) scala> a.filter(_%2==0).map(_*2)
res8: Array[Int] = Array(4, 8) scala> a.filter{_%2==0} map{_*2}
res9: Array[Int] = Array(4, 8)

算法案例:移除第一个负数后的所有负数

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val a = ArrayBuffer[Int]()
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> a += (1,2,3,4,5,-1,-3,-5,-7)
res10: a.type = ArrayBuffer(1, 2, 3, 4, 5, -1, -3, -5, -7) scala> :paste
// Entering paste mode (ctrl-D to finish) var foundFirstNegative = false
var arrayLength = a.length
var index = 0
while(index < arrayLength){
if(a(index)>=0){
index+=1
}else{
if(!foundFirstNegative){foundFirstNegative = true;index+=1}
else{a.remove(index);arrayLength-=1}
}
} // Exiting paste mode, now interpreting. foundFirstNegative: Boolean = true
arrayLength: Int = 6
index: Int = 6 scala> a
res12: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, -1) 第二种,性能更高,数组更少移动 var foundFirstNegative = false
val keepIndexes = for(i <- 0 until a.length if !foundFirstNegative || a(i)>=0
) yield{
if(a(i)<0) foundFirstNegative = true
i
}
for (i <- 0 until keepIndexes.length){a(i) = a(keepIndexes(i))}
a.trimEnd(a.length - keepIndexes.length) scala> a
res15: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, -1)

创建Map

//不可变Map
scala> val ages = Map("Leo"->30,"den"->20,"jack"->23)
ages: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, den -> 20, jack -> 23) scala> ages("Leo")
res0: Int = 30 scala> ages("Leo") = 20
<console>:13: error: value update is not a member of scala.collection.immutable.Map[String,Int]
ages("Leo") = 20
^
//可变Map
scala> val ages = scala.collection.mutable.M
Map MapBuilder MapLike MapProxy MultiMap MutableList scala> val ages = scala.collection.mutable.Map("Leo"->30,"den"->20,"jack"->23)
ages: scala.collection.mutable.Map[String,Int] = Map(jack -> 23, den -> 20, Leo -> 30) scala> ages("Leo")=24 scala> ages("Leo")
res3: Int = 24
//第三种创建方式
scala> val ages = Map(("Leo",30),("Jen",31),("jack",33))
ages: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jen -> 31, jack -> 33) //第四种创建方式
scala> val ages = new scala.collection.mutable.HashMap[String,Int]
ages: scala.collection.mutable.HashMap[String,Int] = Map() scala> ages.put("jack",24)
res5: Option[Int] = None scala> ages
res6: scala.collection.mutable.HashMap[String,Int] = Map(jack -> 24)
//必须判断是否存在,否则不存在会报错
scala> val age = if(ages.contains("jack")) ages("jack") else 0
age: Int = 24
//或者取默认值
scala> val leoAge = ages.getOrElse("Leo",0)
leoAge: Int = 0
//一次性添加多个key-value对
scala> ages+=("Mike"->35,"Tom"->50)
res9: ages.type = Map(jack -> 24, Mike -> 35, Tom -> 50, Leo -> 30)
//移除元素
scala> ages-="Mike"
res10: ages.type = Map(jack -> 24, Tom -> 50, Leo -> 30) //Map本身不可变,下列操作通过生成新的Map实现
scala> val aggs = Map("Leo"->24,"jike"->34)
aggs: scala.collection.immutable.Map[String,Int] = Map(Leo -> 24, jike -> 34) scala> val ages2 = aggs + ("Mike"->20,"Tom"->70)
ages2: scala.collection.immutable.Map[String,Int] = Map(Leo -> 24, jike -> 34, Mike -> 20, Tom -> 70) scala> val ages3 = aggs-"Leo"
ages3: scala.collection.immutable.Map[String,Int] = Map(jike -> 34) scala> aggs
res12: scala.collection.immutable.Map[String,Int] = Map(Leo -> 24, jike -> 34) //Map遍历
scala> for((key,value) <- ages) println(key +" "+value)
jack 24
Tom 50
Leo 30 scala> for(key <- ages.keySet)println(key)
jack
Tom
Leo scala> for(value <- ages.values) println(value)
24
50
30
//反转key和value
scala> for((key,value) <- ages) yield(value,key)
res16: scala.collection.mutable.HashMap[Int,String] = Map(50 -> Tom, 30 -> Leo, 24 -> jack)

Map排序

//自动对Map的key排序
scala> val ages = scala.collection.immutable.SortedMap("leo"->30,"alice"->14,"jen"->25)
ages: scala.collection.immutable.SortedMap[String,Int] = Map(alice -> 14, jen -> 25, leo -> 30) //保证插入顺序和读取顺序相同
scala> val aggs = new scala.collection.mutable.LinkedHashMap[String,Int]
aggs: scala.collection.mutable.LinkedHashMap[String,Int] = Map() scala> aggs("leo")=30
scala> aggs("jike")=40
scala> aggs("alice")=15 scala> aggs
res22: scala.collection.mutable.LinkedHashMap[String,Int] = Map(leo -> 30, jike -> 40, alice -> 15)

Map的元素类型-Tuple

//简单tuple
scala> val t = ("leo",30)
t: (String, Int) = (leo,30) scala> t._1
res23: String = leo scala> t._2
res24: Int = 30 //zip操作,将两数组拼接成元组
scala> val names = Array("leo","jack","mike")
names: Array[String] = Array(leo, jack, mike) scala> val ages = Array(30,24,26)
ages: Array[Int] = Array(30, 24, 26) scala> val nameAges = names.zip(ages)
nameAges: Array[(String, Int)] = Array((leo,30), (jack,24), (mike,26)) scala> for((name,age)<-nameAges) println(name +":" + age)
leo:30
jack:24
mike:26

Spark基础-scala学习(一、入门)的更多相关文章

  1. Spark基础-scala学习(三、Trait)

    面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...

  2. Spark基础-scala学习(二、面向对象)

    面向对象编程之类 //定义一个简单的类 scala> :paste // Entering paste mode (ctrl-D to finish) //类默认public的 class He ...

  3. Spark基础-scala学习(八、隐式转换与隐式参数)

    大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可.Scala会自动使用隐式转换函数.隐式转换 ...

  4. Spark基础-scala学习(七、类型参数)

    类型参数是什么 类似于java泛型,泛型类 泛型函数 上边界Bounds 下边界 View Bounds Context Bounds Manifest Context Bounds 协变和逆变 Ex ...

  5. Spark基础-scala学习(五、集合)

    集合 scala的集合体系结构 List LinkedList Set 集合的函数式编程 函数式编程综合案例:统计多个文本内的单词总数 scala的集合体系结构 scala中的集合体系主要包括:Ite ...

  6. Spark基础-scala学习(四、函数式编程)

    函数式编程 将函数赋值给变量 匿名函数 高阶函数 高级函数的类型推断 scala的常用高阶函数 闭包 sam转换 currying函数 return 将函数赋值给变量 scala中的函数是一等公民,可 ...

  7. Spark之Scala学习

    1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...

  8. Scala学习笔记——入门

    0.在 scala> 下运行Scala程序 首先cd到.scala文件所在的目录下 scalac这个scala文件,然后import package的名字.object的名字 然后就能使用 ob ...

  9. javascript入门视频第一天 小案例制作 零基础开始学习javascript

    JavaScript 是我们网页设计师必备的技能之一.我们主要用javascript来写的是网页特效.我们从零基础开始学习javascript入门. 但是,好的同学刚开始不知道怎么学习,接触js,因此 ...

随机推荐

  1. py文件的运行

    安装过程及配置 安装过程准备: 下载好Python的安装程序后,开始安装,在进入安装界面后一定确保勾选将Python加入到系统环境变量的路径里.如图所示: 2 如果没有选取,那么按照下面的步骤进行操作 ...

  2. db2数据库备份及恢复

    导出 1. 连接数据库,命令如下: db2 connect to db_name user user_name using password db_name 是指数据库的名字, user_name 是 ...

  3. WebDriver中的操作使用

    1.WebDriver中使用jquery假如设定jquery包的路径为path,则程序如下: String jquery=null; FileInputStream input = new FileI ...

  4. 55行代码实现Java线程死锁

    死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中.那么如何创造出一个简单的死锁情况?请看代码: class Test implements Runnable { boolean ...

  5. Scrum冲刺阶段6

    成员今日完成的任务 人员 任务 何承华 学习后端设计 陈宇 后端设计 丁培辉 学习后端设计 温志铭 信息界面设计 杨宇潇 信息界面界面设计 张主强 服务器构建学习 成员遇到的问题 人员 问题 何承华 ...

  6. 20155312 张竞予 Exp6 信息搜集与漏洞扫描

    Exp6 信息搜集与漏洞扫描 目录 基础问题回答 (1)哪些组织负责DNS,IP的管理. (2)什么是3R信息. (3)评价下扫描结果的准确性. 实验总结与体会 实践过程记录 (1)各种搜索技巧的应用 ...

  7. Struts2内建拦截器

    params拦截器 负责将请求参数设置为Action属性 staticParams拦截器 将配置文件中action元素的子元素param参数设置为Action属性 servletConfig拦截器 将 ...

  8. JavaBean动作元素

    用动作标签创建Javabeans实例 <jsp:useBean id="实例对象名" class="com.po.Users(类全名)" scope=&q ...

  9. Python Day 11

    阅读目录 内容回顾 函数的参数 函数的嵌套调用 ##内容回顾 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 ...

  10. Oracle 12c 安装问题及解决方案

    1. 介绍 今天在我的开发电脑上安装Oracle12c,电脑环境是windows10家庭中文版,安装的Oracle数据库版本Oracle(12.1.0.2.0) - Standard Edition ...