Scala学习一

1.集合操作练习

//创建一个List
val lst0 = List(1,7,9,8,0,3,5,4,6,2)
//将lst0中每个元素乘以10后生成一个新的集合
lst0.map(x =>  x*10 ) OR  lst0.map(_*10 )
//将lst0中的偶数取出来生成一个新的集合
lst0.filter(x => x%2==0)
lst0.filter(x => x%2==0).map(_*5)
//将lst0排序后生成一个新的集合
lst0.sorted
lst0.sortBy(x => x)
lst0.sortWith((x,y) => x<y)  OR lst0.sortWith(_ < _)

//反转顺序
lst0.reverse

//将lst0中的元素4个一组,类型为Iterator[List[Int]]
lst0.grouped(4)
res5: Iterator[List[Int]] = non-empty iterator

//将Iterator转换成List
lst0.grouped(4).toList
res6: List[List[Int]] = List(List(0, 1, 2, 3), List(4, 5, 6, 7), List(8, 9))

//将多个list压扁成一个List
lst0.grouped(4).toList.flatten
res7: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

 //遍历数组
val lst0 = List(1,7,9,8,0,3,5,4,6,2)
scala> for(i <-arr)println(i)
1
2
3
4
5

//map:遍历数组,返回值放到新的数组
scala> arr.map(x => println(x))//println方法转成函数
1
2
3
4
5
res5: Array[Unit] = Array((), (), (), (), ())

//foreach:遍历数组,返回值不放到新的数组
scala> arr.foreach(x=>println(x))
1
2
3
4
5

2.聚合

scala> val arr = List(List(1, 2, 3), List(3, 4, 5), List(2), List(0))

scala> arr.aggregate(0)(_+_.sum,_+_)    
res14: Int = 20

scala> arr.aggregate(10)(_+_.sum,_+_)
res16: Int = 30

//4个par,10+10+10+10+20=60
scala> arr.par.aggregate(10)(_+_.sum,_+_)
res17: Int = 60 

val l1 = List(5,6,4,7)
val l2 = List(1,2,3,4)
//求并集
scala> l1.union(l2)
res11: List[Int] = List(5, 6, 4, 7, 1, 2, 3, 4)
scala> l1 union l2
res10: List[Int] = List(5, 6, 4, 7, 1, 2, 3, 4)
//求交集
scala> l1.intersect(l2)
res12: List[Int] = List(4)
//求差集
scala> l1.diff(l2)
res13: List[Int] = List(5, 6, 7)

3.单机版WordCount

scala> val lines = List("hello tom hello jerry", "hello jerry", "hello kitty", "hello tom hello")
//先按空格切分,在压平
scala> lines.map(_.split(" "))
res9: List[Array[String]] = List(Array(hello, tom, hello, jerry), Array(hello, jerry), Array(hello, kitty), Array(hello, tom, hello))

scala> res9.flatten
res10: List[String] = List(hello, tom, hello, jerry, hello, jerry, hello, kitty, hello, tom, hello)

//map和flatten操作一气呵成flatMap
scala> lines.flatMap(_.split(" "))
res11: List[String] = List(hello, tom, hello, jerry, hello, jerry, hello, kitty, hello, tom, hello)

//按照(word,1)形式构建元祖
scala> res11.map((_,1))
res12: List[(String, Int)] = List((hello,1), (tom,1), (hello,1), (jerry,1), (hello,1), (jerry,1), (hello,1), (kitty,1), (hello,1), (tom,1), (hello,1))

//按照单词groupBy
scala> res12.groupBy(_._1)
res13: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(tom -> List((tom,1), (tom,1)), kitty -> List((kitty,1)), jerry -> List((jerry,1), (jerry,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1), (hello,1), (hello,1)))

scala> res13.map(_._1)
res14: scala.collection.immutable.Iterable[String] = List(tom, kitty, jerry, hello)

//错误
scala> res13.map(_._1,_._2.size)
<console>:12: error: too many arguments for method map: (f: ((String, List[(String, Int)])) => B)(implicit bf: scala.collection.generic.CanBuildFrom[scala.collection.immutable.Map[String,List[(String, Int)]],B,That])That
              res13.map(_._1,_._2.size)

//正确
scala> res13.map(t => (t._1,t._2.size))
res16: scala.collection.immutable.Map[String,Int] = Map(tom -> 2, kitty -> 1, jerry -> 2, hello -> 6)

//错误,map没有sortBy方法
scala> res16.sortBy(_._2)
<console>:13: error: value sortBy is not a member of scala.collection.immutable.Map[String,Int]
              res16.sortBy(_._2)

//先转成List
scala> res16.toList.sortBy(_._2)
res18: List[(String, Int)] = List((kitty,1), (tom,2), (jerry,2), (hello,6))

scala> res16.toList.sortBy(_._2).reverse
res19: List[(String, Int)] = List((hello,6), (jerry,2), (tom,2), (kitty,1))

4.mapValues对取出来的每一对K-V的V进行操作

scala> val lines = List("hello tom hello jerry", "hello jerry", "hello kitty")
scala> lines.flatMap(_.split(" " )).map((_,1)).groupBy(_._1).mapValues(_.size)
res22: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, kitty -> 1, jerry -> 2, hello -> 4)

课题:对数据处理先局部后整体,每一个元祖里面的V,就不是1,对每一个V取size是不对的。

scala> val a =  Array(1,2,3,4,5,6)
a: Array[Int] = Array(1, 2, 3, 4, 5, 6)

scala> a.sum
res23: Int = 21

//整体汇总
//实际上调用的是reduceLeft
scala> a.reduce(_ + _)
res24: Int = 21

//并行支持
scala> a.par
res25: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3, 4, 5, 6)

scala> a.par.reduce(_ + _)
res26: Int = 21

//折叠:有初始值(无特定顺序)
//fold(default value)(_ + _)

scala> a.fold(10)(_ + _)
res27: Int = 31

//双核四线程的电脑环境,四个线程一起计算,21 + 10 *4
scala> a.par.fold(10)(_ + _)
res28: Int = 51
 
//折叠:有初始值(有特定顺序)
//foldLeft()(_ + _)
//foldRight()(_ + _)

scala> lines.flatMap(_.split(" " )).map((_,1)).groupBy(_._1)
res29: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(tom -> List((tom,1)), kitty -> List((kitty,1)), jerry -> List((jerry,1), (jerry,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1)))

scala> res29.mapValues(_.foldLeft(0)(_ + _._2))
res31: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, kitty -> 1, jerry -> 2, hello -> 4)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

Ramda 函数库参考教程

学习函数式编程的过程中,我接触到了 Ramda.js。 我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具。...

93980
来自专栏LanceToBigData

JavaSE(五)JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴!  ...

24060
来自专栏Spark学习技巧

Java反射机制深入详解

一.概念   反射就是把Java的各种成分映射成相应的Java类。   Class类的构造方法是private,由JVM创建。   反射是java语言的一个特性...

1.8K70
来自专栏Java帮帮-微信公众号-技术文章全总结

10(02)总结形式参数,包,修饰符,内部类

6:内部类(理解) (1)把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。 (2)内部类的访问规则 A:可...

29060
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day6 Java字符串

  字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串。Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组。至于...

21480
来自专栏猿人谷

扑克牌的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字...

20590
来自专栏yl 成长笔记

链表

链表定义:一种递归的数据结构, 它是在集合类的抽象数据,它或者为空, 或者是指向一个节点 (node) 的引用, 该结点含有一个泛型的元素和一个指向另一条链表的...

20110
来自专栏web前端教室

javascript 红皮高程(8)

今天继续,JS的数值转换。这里面的坑啊, 真是太多了。 JS有三个函数可以把非数值转为数值: Number(); parseInt(); parseFloat(...

196100
来自专栏Golang语言社区

Go 语言的基本数据类型

0)变量声明 var 变量名字 类型 = 表达式 例: var num int = 10 复制代码 其中“类型”或“= 表达式”两个部分可以省略其中的一个。 1...

438110
来自专栏Java爬坑系列

【Java入门提高篇】Day9 Java内部类——静态内部类

  今天来说说Java中的最后一种内部类——静态内部类   所谓的静态内部类,自然就是用static修饰的内部类,那用static修饰过后的内部类,跟一般的内部...

23460

扫码关注云+社区

领取腾讯云代金券