最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

scala 基础 2

[复制链接]
跳转到指定楼层
楼主
发表于 2018-3-16 13:23:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

lazy关键字
惰性变量用法放在不可变变量之前
只有在调用惰性变量时才会去实例化这个变量,类似于java中单例模式的懒汉模式

object LazyDemo {def init():Unit = { println("init") } def main(args: Array[String): Unit = {val property = init()       //没有lzay关键字的时候println("init after")println(property)}}object LazyDemo2{def init():Unit = {println("init")}def main(args: Array[String): Unit = { lazy val property = init()        //有lzay关键字的时候,在调用的时候才去初化它println("init after")println(property)}}

集合高级操作:

object ListDemo {def main(args: Array[String): Unit = {val list0 = List(1, 2, 3, 4, 5, 6, 7, 8)//循环每一个元素并按函数的结果生成新的集合val list1 = list0.map(_ * 2)//循环每一个元素并按进行过滤,过滤掉不满足条件的,返回新的集合val list2 = list0.filter(_ % 2 == 0)//集合升序val list3 = list0.sorted//集合倒序val list4 = list3.reverse//集合里的元素每几个分成一组val it = list0.grouped(2)//将迭代器转成可变数组//val list5 = it.toBuffer//    println(list5)//将迭代器转成不可变序列,注意迭代器的循环在调用it.toBuffer// 或it.toList循环到结尾所以在第一次调用的时候就把值全取出来了val list6 = it.toList//将list重新组合val list7 = list6.flatten val list8 = List("a b c", "d e f") val list9 = list8.map(_.split(" ")) //将Array[String]进重新组合,不支持元组 val list10 = list9.flatten//flatMap等于map和flatten的结合val list11 = list8.flatMap(_.split(" ")) //利用机器的空闲线程进行并行计算,也就是每个线程拿一部分数据进行并行求合, // 最后再进行汇总和mr的wordcount类似val res = list0.par.sum //普通的求合 val res1 = list0.sum//按照List里从头到尾的顺序进行累加,就是从左向右加val res2 = list0.reduce(_ + _) val res3 = list0.reduceLeft(_ + _) val res4 = list0.reduceRight(_ + _) //用结果演示是否并行化,分的线程不一样,结果也就不一样,因为每个线程拿到的数据都是随机的val res5 = list0.par.reduce(_ - _)//结定初始值为10,然后进行每一项的累加 val res6 = list0.fold(10)(_ + _) val res66 = list0.fold(10)(_ - _)//给定初始值为10,然后累加每一项,分的线程不一样,结果也就不一样 val res7 = list0.par.fold(10)(_ + _)//按特定顺序进行操作 val res8 = list0.foldLeft(10)(_ + _) val res9 = list0.foldRight(10)(_ + _) val res10 = list0.foldLeft(10)(_ - _) val res11 = list0.foldRight(10)(_ - _) //因为这里par使用的是foldLeft所以是有特定顺序的 val res12 = list0.par.foldLeft(10)(_ - _)val list12 = List(List(1, 2), List(1, 3), List(3, 4, 5), List(2))//    val res13 = list12.reduce(_.sum + _.sum)//聚合操作//    val res14 = list12.aggregate(0)((a,q) => {println(a + "," + q.sum);a + q.sum},(a ,b) => a) val res14 = list12.aggregate(0)(_ + _.sum, _ + _) val res13 = list12.foldLeft(0)(_ + _.sum)//aggregate没有被par调用时第2个参数并没有参与运算val res18 = list12.par.aggregate(0)((a,q) => {println(a + "," + q.sum);a + q.sum}, (a,b) => {println(a + "," + b);a + b})println(res18) //并集  val res15 = List(1,2) union List(3,4)//交集 val res16 = List(1,2) intersect List(1,5) //差集 val res17 = List(1,2) diff List(1) println(res15)println(res16)println(res17)}}

wordcount

object WordCount {def main(args: Array[String): Unit = {val lines = List("a b c d","a d e s","a b d e","a a a b") //切分并生成一个list val words = lines.flatMap(_.split(" ")) //把每个单词生成 (自身,1) 的元组val tuples = words.map((_ -> 1))//以key(单词)进行分组val group = tuples.groupBy(_._1) //统计每组key的values的长度val mapValue = group.mapValues(_.size)//升序val list = mapValue.toList.sortBy(_._2) //降序 val result = list.reverseprintln(result)}}


scala中类的关键字默认就是public的,所以如果是public的则不需要加访问限制关键字
一个类文件可以声明多个类

语法:
class 类名{

}
静态类
object 类名{

}

如果类名和静态类的类名相同那这个静态类就叫做这个类的伴生对象

类中的属性:
可以分为可变(var)和不可变(val)
访问修饰可以分private和private[this]

示例:

class ClassDemo {//用val修改的变量是只读的,相当只有get方法,没有set方法val name: String = "hainiu"//用var修饰的变量相当于既有get又有set方法 var gender: String = _//用private修饰的属性,该属性属于对象私有变量,只有本类和伴生对象能访问到private var age: Int = _//用private[this]修饰后,该属性属于对象私有变量,只有本类才能访问,伴生对象也访问不到,//注意这个变量并没有指定类型这里是scala自己根据值进行推断的private[this val location = "北京"}/*** 类ClassDemo的伴生对象*/object ClassDemo {def main(args: Array[String): Unit = {val demo = new ClassDemo//demo.name = "hainiu1"println(demo.name)println(demo.gender)demo.gender = "男"println(demo.gender)println(demo.age)//    println(demo.location)}}/*** 其它对象*/object ClassDemo1{def main(args: Array[String): Unit = {val demo = new ClassDemo//    demo.name = "hainiu1"println(demo.name)println(demo.gender)demo.gender = "男"println(demo.gender)//    println(demo.age)//    println(demo.location)}}

构造器:
用于对类进行属性的初始化,分为主构造器和辅助构造器

1).主构造器用法:
语法:
//参数可以有默认值
class 类名(参数列表){

}

示例:

class ConDemo(val name: String, var age: Int, location: String = "北京") {def getLocation():String={//不可能进行修改因为是被当成val修饰的//    location = "上海"//如果没有写return那最后一句代码的值就被做为返回location}}object ConDemo {def main(args: Array[String): Unit = {//因为location有默认值,所以调用构造函数的时候可以不用写val demo = new ConDemo("hainiu", 1)//不能改因为是val修饰的//demo.name = "hai1niu"demo.age = 100println(demo.name)println(demo.age)//不能访问因为没有val或var修饰,就相当于是用private[this] val修饰的属性,要访问只能自己写相应的get方法//    println(demo.location)}}

2).辅助构造器用法:
语法:

//辅助构造器中使用的变量进行声明
var a:String = _

def this([辅助构造器参数列表...],a:String){
this(主构造器参数列表) //看自己的情况来定是否辅助构造器参数列表与主构造器参数列相同
this.a = a //这个a变量需要在class中进行声明,不然提示找不到这个变量
}

示例:

class ConDemo1(val name:String,var age:Int,location:String = "北京") {def getLocation:String = {location}var gender:String = _/*** 辅助构造器*/def this(name:String,age:Int,location:String,gender:String){//辅助构造器第一行必须要先调用主构造器this(name,age,location)this.gender = gender}}object ConDemo1{def main(args: Array[String): Unit = {val demo = new ConDemo1("hainiu",1,"上海","男")println(demo.name)println(demo.age)println(demo.getLocation)println(demo.gender)}}

总结:
主构造器的参数列表要放到类名的后面,和类名放在一起,val修饰的构造参数具有不可变性,var修饰的构造参数具有可变性
如果参数没有用val或var修饰那它既不可被外面直接方问(可通过相应的get方法访问)只能在本类中使用,伴生对象也无法使用,也不可在本类中进行修改因为它被当成隐藏的val修饰的

辅助构造器可以没有,如果有要在类中进行定义,辅助构造器可以声明主构造器没有的参数,如果声明了其它参数那这个参数需要在类中进行定义,否则提示无法找到这个参数
辅助构造器也可以理解成java中的构造器重载,且辅助构造器的第一行必须要先调用主构造器(这点和python的基础调用父类比较相似)

idea使用:


如果按ctrl+p,提示有两行或多行的时候那就说明有铺装构造器


快捷键修改
单例对象
在scala中没有像java一样的static关键字
在scala中是没有静态方法和静态字段的,但是可以使用object关键字加类名的语法结构实现同样的功能
在scala中用object修饰的为单例对象,单例对象中主要存放常量和工具方法

示例:


import scala.collection.mutable.ArrayBufferobject Single{def main(args: Array[String): Unit = {val factory = SingleFactoryprintln(factory.getSession)println(factory.getSession.size)println(factory.getSession(0))println(factory.removeSession)println(factory.getSession.size)}}object SingleFactory {/*** 相当于java中的静态块*/println("SingleFactory Init")var i = 5private val session = ArrayBuffer[A()while(i > 0){session += new A()i -= 1}def getSession = sessiondef removeSession:Unit ={val s = session(0)session.remove(0)println(s"session被移除$s")}}class A{}

伴生对象
特征:一个单例对象未必是一个伴生对象,但是一个伴生对象一定是一个单例对象
与类名相同并且用Object修饰的对象叫做伴生对象,类和伴生对象之间可以互相访问对方的私有方法和属性

示例

class Cat{private var name:String = "lanmao"println(Cat.skill)private def action():Unit = {println(name + "_" + Cat.skill)}}object Cat{private val skill = "挠人"def main(args: Array[String): Unit = {val c = new Cat()println(c.name)c.name = "tumao"c.action()}}

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海牛部落-青牛,http://hainiubl.com



楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-4-24 10:42

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表