scala 基础
1.scala一些预热操作
1.1 to 是一个方法,()可以进行 参数传递,map()把每一个元素取出来进行相应的操作,
- print(1.to(10).map(_*10))
- 结果
- Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
1.2取数组中的每一个值
- val arr=Array(1,2,3,4,5,6,7,8,9)
- //直接遍历每一个值
- for (i<-arr) print(i+" ")
- //通过下标遍历每一个值 until是取值左闭右开
- for(i <- 0 until arr.length) println(arr(i))
1.3 List的flatten 可以将一个list嵌套list、list嵌套字符串压平
- val ls1=List(1,2,3,4,5,6,7,8,9)
- val ls2=ls1.grouped(5)
- val ls3=ls2.toList
- println(ls3) //List(List(1, 2, 3, 4, 5), List(6, 7, 8, 9))
- println(ls3.flatten) //list套list有压平操作 也可以压平 list中套多个字符串的情况
- 结果:list(1, 2, 3, 4, 5, 6, 7, 8, 9)
1.4取一个元组的第n个值
- val t=(1,2,3,4,4,5,6)
- print(t._2) ////去元组的第n个
2.wordcount
- val lines=List("hello tom hello jerry","hello tom hello kitty hello china")
- 方法一:
- val wc=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(t=>(t._1,t._2.size)).toList.sortBy(_._2).reverse
- 方法二:
- val wc2=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.size)
- 方法三:
- val wc3=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))
- 如果是在spark上:
- val wc4=lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).collect
2.1flatMap=map+flatten
- val words=lines.flatMap(_.split(" "))
- 结果:
- List(hello, tom, hello, jerry, hello, tom, hello, kitty, hello, china)
可以拆分map过程
- lines.map(_.split(" "))
- 拿到每一个元素(字符串),按照空格切割,切割后返回两个数组,仍放在List中
- res0: List[Array[String]] = List(Array(hello, tom, hello, jerry), Array(hello, tom, hello, kitty, hello, china))
flatten过程
- lines.map(_.split(" ")).flatten
- List(hello, tom, hello, jerry, hello, tom, hello, kitty, hello, china)
2.2 将单词出现一次和1放在一起(放入元组)
- val wordsAndOne=words.map((_,1))
- List((hello,1), (tom,1), (hello,1), (jerry,1), (hello,1), (tom,1), (hello,1), (kitty,1), (hello,1), (china,1))
2.3 groupBy按照单词分组返回map
- 第一个_ 表示List中的每一个元组,取元组中的某一个元素用._n,即按照元组中的某一元素分组,返回是一个map
- val grouped =wordsAndOne.groupBy(_._1)
- Map(kitty -> List((kitty,1)), china -> List((china,1)), tom -> List((tom,1), (tom,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1), (hello,1)), jerry -> List((jerry,1)))
2.4求和
- t就是每一个对偶元组, 仍返回一个map
- val result = grouped.map(t=>(t._1,t._2.size))
- Map(kitty -> 1, china -> 1, tom -> 2, hello -> 5, jerry -> 1)
直接对第一个单词和list.size 但scala中不予许这样的操作
- 第一个_ 拿到一个对偶元组,取元组中的第一个元组。_._2.size即是取对偶元组第二个的大小。
- val result=grouped.map(_._1,_._2.size)
2.5 按出现次数从大到小排序M:默认自然排序, map没有sortBy 先将map.toList
- val finalResult=result.toList.sortBy(_._2).reverse
- List((hello,5), (tom,2), (jerry,1), (china,1), (kitty,1)
3.方法二中:mapValues的_ 指的是元组的值 即v。key 不动,只是对values进行处理 结果 k v 一起返回
val wc2=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.size)
4.方法三中:
fold(0)(_+_) 0 是初始值
Map(kitty -> List((kitty,1)), china -> List((china,1)), tom -> List((tom,1), (tom,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1), (hello,1)), jerry -> List((jerry,1)))
foldLeft(0)(_+_._2)第一个_表示初始值或者上一次累加的结果 中第二个_ ,表示拿到的每一个元组,第三个元组的中第n个值
val wc3=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))
5.reduce和fold操作
- val a=Array(1,2,3,4,5,6)
- println(a.sum) //求和 21
- println(a.reduce(_+_))//21 聚合操作要求传递两个参数
- println(a.reduce(_-_))//-19 也可以进行减法操作
a.reduce(_+_) 默认调用 a.reduceLift (((((1+2)+3)+4)+5)+6)
println(a.par.reduce(_+_)) //21 par转化成并行化操作
fold 也支持并行化--并行计算,及柯里化
- val b=Array(1,2,3,4,5,6)
- println(b.fold(10)(_+_)) //31和cpu核心数无关
- println((b.par.fold(10)(_+_))) //61和cpu核心数有关,2核心4线程,所以4*10
- println((b.par.fold(0)(_+_))) //21
- println(b.foldLeft(10)(_+_)) //31
- println(b.foldRight(10)(_+_)) //31
scala 基础的更多相关文章
- 【Scala学习之一】 Scala基础语法
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Scala学习(一)--Scala基础学习
Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...
- Scala基础(1)
Scala基础语法 声明与定义: val,常量声明 val x:T(把x声明成一个类型为T的常量) x是变量的名字,T是变量的类型 v ...
- scala 基础知识总结
在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...
- 1.scala基础语法总结
Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...
- Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...
- Scala 基础(7)—— 函数字面量和一等函数
1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...
- Scala 基础(5)—— 构建函数式对象
有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...
- Scala基础知识[一]
摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...
- Scala基础简述
* Scala基础简述 本文章作为Scala快速学习的教程,前提环境是:我假设在此之前,你已经学会了Java编程语言,并且我们以随学随用为目标(在此不会深度挖掘探讨Scala更高级层次的知识).其中语 ...
随机推荐
- Word中的段落
Word文档中的块级内容的最基本单位是段落,段落用<p>元素进行存储.段落定义在新行中开始,段落可以包含三方面的信息:可选的段落属性.内嵌的内容(通常为文本)和用于比较两个文档的内容的一组 ...
- PB窗口根据分辨率的大小调整窗口大小
//来自:http://topic.csdn.net/u/20070105/09/88f3c417-6882-4e26-b622-0f9a0a9a65e0.html //给你个通用函数,在窗口的OPE ...
- 剑指offer编程题Java实现——面试题8旋转数组的最小数字
剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1, ...
- sql-向已有数据的表添加约束
语法: alter table 表名 with nocheck add constraint 约束名 约束类型 具体的约束说明 对表中现有的数据不做检查, 只对添加约束后再录入的数据进行检查. 例子: ...
- PMS构造函数以及apk如何扫描
一.PackageManagerService构造函数 1.创建data目录下面以及文件(settings的构造函数),然后再添加6个SharedUserSetting 2.开始扫描并且解析APK 3 ...
- Jira/Confluence的备份、恢复和迁移
之前的文章已经分别详细介绍了Jira.Confluence的安装及二者账号对接的操作方法,下面简单说下二者的备份.恢复和迁移: 一.Jira.Confluence的备份.恢复1)Confluence的 ...
- accept:Invalid Argument
错误 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int accept(int sockfd, ...
- Android数据存储之SharedPreferences使用
SharedPreferences是Android中一种轻型的数据存储类.本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared ...
- Swift5 语言指南(十一) 结构和类
结构和类是通用的,灵活的结构,它们成为程序代码的构建块.您可以使用与定义常量,变量和函数相同的语法来定义属性和方法,以便为结构和类添加功能. 与其他编程语言不同,Swift不要求您为自定义结构和类创建 ...
- nginx访问问题
root响应的路径:配置的路径(root指向的路径)+完整访问路径(location的路径)+静态文件alias响应的路径:配置路径+静态文件(去除location中配置的路径)