3000门徒内部训练绝密视频(泄密版)第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读
彻底精通Scala隐式转换和并发编程及Spark源码阅读
Akka ,Scala内部并发
隐式转换、隐式类、隐式参数
可以手动指定某种类型的对象或类转换成其他类型的对象或类。转换的原因是假设写好接口
implicit conversion function
implicit def function
根据隐式转换签名,在运行时将其转换成另一个类型,完成后还回来。
命名规则:…to…
scala> class Person(val name: String)
defined class Personscala> new Person("Spark")
res1: Person = Person@1936f0f5scala> class Engineer(val name:String, val salary: Double) {def code = println("Coding ...")}
defined class Engineer//无法调用
scala> def toCode(p: Person){p.code}
<console>:9: error: value code is not a member of Personp.//定义隐式转换函数^//定义隐式转换函数
scala> implicit def person2Engineer(p: Person):Engineer = { new Engineer(p.name, 10000)}
warning: there was one feature warning; re-run with -feature for details
person2Engineer: (p: Person)Engineerscala> def toCode(p: Person){p.code}
toCode: (p: Person)Unitscala> toCode(new Person("Scala"))
Coding ...
隐式参数
上下文中通过隐式参数在每次运行的实例对象中注射入隐式参数作用于参数时上下文注入的,不用手动,而是自动的注入隐式参数
implicit val
implicit var
隐式参数类型的伴生对象中去找隐式值
scala> class Level(val level: Int)
defined class Levelscala> def toWorker(name:String)(implicit l : Level) = println(name + " :" + l.level)
toWorker: (name: String)(implicit l: Level)Unitscala> implicit val level = new Level(8)
level: Level = Level@54a097ccscala> toWorker("Spark")
Spark :8object Context_Implicits{implicit val default:String = "Flink"
}object Param{def print(context:String)(implicit language: String) {println(language+ " : " + context)}
}
Param.print("Spark")("Scala")
import Context_Implicits._
Param.print("Hadoop")
隐式对象
abstract class Template[T] {def add(x: T, y:T): T
}
abstract class SubTemplate[T] extends Template[T] {def unit: T
}implicit object StringAdd extends SubTemplate[String] {override def add(x: String, y: String) = x concat yoverride def unit : String = ""
}
implicit object IntAdd extends SubTemplate[Int] {override def add(x: Int, y: Int) = x + yoverride def unit: Int = 0
}
def sum[T](xs: List[T])(implicit m: SubTemplate[T]) :T = {if(xs.isEmpty) m.unitelse m.add(xs.head, sum(xs.tail))
} println(sum(List(1,2,3,4,5)))println(sum(List("Spark", "Hadoop", "Flink")))
隐式类
import java.io.File
import scala.io.Source
object Context_Helper{implicit class FileEnhancer(file : File){def read = Source.fromFile(file.getPath).mkString}implicit class Op(x: Int) {def addSAP(second : Int) = x + second}
}import Context_Helper._
println(1.addSAP(2))
3println(new File("/home/tom/scalatest/1.txt").read)
隐式转换、隐式参数、隐式对象、隐式类
implicit从哪里找?
1、从当前类的伴生对象中找
2、放到object里面,import进来
3、从当前作用域中有隐式的东西
4、用到的时候才写隐式的import
并发编程
高手都是消息通信并发、缓存
Actor来提供并发,与java中的Thread类似
java共享全局变量的加锁机制,不可避免的带来死锁
Scala的Actor去掉了共享全局变量,全部都是私有的,线程间通过消息通信
Actor Akka框架
scala> import scala.actors.Actor
import scala.actors.Actorscala> class HiActor extends Actor {def act(){while(true){receive { case name: String =>println(name)}}}}
warning: there was one deprecation warning; re-run with -deprecation for details
defined class HiActorscala> val actor = new HiActor
actor: HiActor = HiActor@361d169ascala> actor.start()
res5: scala.actors.Actor = HiActor@361d169ascala> actor ! "Spark"
Spark
一个源码中常用的的例子
scala> case class Basic(name: String, age: Int)
defined class Basicscala> case class Worker(name: String, age:Int)
defined class Workerscala> class basicActor extends Actor{| def act(){| while(true){| receive {| case Basic(name,age) => println("Basic Information: " + name + " : " + age)| case Worker(name, age) => println("Worker Information: " + name + " : " + age)| }| }| }| }
warning: there was one deprecation warning; re-run with -deprecation for details
defined class basicActorscala> val b = new basicActor
b: basicActor = basicActor@3f46fb53scala> b.start
res8: scala.actors.Actor = basicActor@3f46fb53scala> b ! Basic("Scala", 13)
Basic Information: Scala : 13scala> b ! Worker("Spark", 14)
Worker Information: Spark : 14
同步:
!? 等待回复
val result = b !? Worker(“Spark”, 14)
将来回复后保存
val future = b !!Worker(“Spark”, 14)
3000门徒内部训练绝密视频(泄密版)第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读相关推荐
- 3000门徒内部训练绝密视频(泄密版)第3课:Scala中函数式编程彻底精通及Spark源码阅读
Scala中函数式编程彻底精通及Spark源码阅读 函数可以不依赖于类,函数可以作为函数的参数,函数可以作为函数的返回值 =>表明对左面的参数进行右面的加工 函数赋值给变量需要在函数名后面加空格 ...
- 3000门徒内部训练绝密视频(泄密版)第8课:彻底实战详解使用IDE开发Spark程序
彻底实战详解使用IDE开发Spark程序 使用IDE开发Spark分析 使用IDE开发Spark实战 使用IDE开发Spark的Local和Cluster 开发两种选择:IDEA.Eclipse 下载 ...
- 3000门徒内部训练绝密视频(泄密版)第1课:大数据最火爆语言Scala光速入门
大数据最火爆语言Scala光速入门 scala 可以使用java的库 scala 的工厂方法:apply 条件表达式有返回值 数组可以用to ,箭头 <- 最后一行内容的值是整个代码块的返回值 ...
- 3000门徒内部训练绝密视频(泄密版)第2课:Scala面向对象彻底精通及Spark源码阅读
Scala面向对象彻底精通及Spark源码阅读 不用写public class中的public class Person {private var myName = "flink" ...
- Underscore源码阅读极简版入门
看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: github.com/hanzichi/un- 一.架构的实现 1.1:架构 (f ...
- divcss布局模板代码_(带手机版数据同步)天花板循环扇类网站织梦模板 小家电电器类网站源码下载...
模板名称:(带手机版数据同步)天花板循环扇类网站织梦模板 小家电电器类网站源码下载 本套织梦模板采用织梦最新内核开发的模板,这款模板使用范围广,不仅仅局限于一类型的企业,天花板循环扇.家电电器网站源码 ...
- 穿透版CTP综合交易平台接口V2.0-程序化交易编程模板(VC源码)
期货程序化VC++ .做最好用的程序化交易软件. 最快的交易速度.最简单的交易策略编写.高级语言竟然如此简单! void MA_CROSS_Trade(CThostFtdcDepthMarketDat ...
- 文本匹配开山之作-DSSM论文笔记及源码阅读(类似于sampled softmax训练方式思考)
文章目录 前言 DSSM框架简要介绍 模型结构 输入 Encoder层 相似度Score计算 训练方式解读 训练数据 训练目标 训练方式总结 DSSM源码阅读 训练数据中输入有负样本的情况 输入数据 ...
- 仿微信H5聊天系统即时通讯社交完整优化版搭建,IM聊天APP聊天交友客服,带安卓苹果端APP源码+视频教程
H5聊天系统即时通讯社交完整优化版,IM聊天APP聊天交友客服仿微信 带安卓苹果端APP源码+教程
最新文章
- 中科院遗传发育所王秀杰团队鉴定出10种潜在的2019-nCoV蛋白酶抑制剂
- Squid 反向代理服务器配置
- FAGLF101 应收(付)重组配置和操作
- 【KMP模板】简单写个KMP~
- 「今天沾一口野味,明天地府相会!」AI如何抗击「野味肺炎」
- 没有bug队——加贝——Python 57,58
- 编译原理----词法分析程序----python语言版
- CHtmlCtrl在VC中的使用
- XSS-Game level 11
- C++学习笔记(二)——构造函数和析构函数
- 关于np.meshgrid
- phpexcel 日期 时分秒_PHPExcel对于Excel中日期和时间类型的处理
- 【Matlab】利用matlab画圆
- ( 科来网络分析系统 )简单的抓包步骤,具体的后面文章说
- 阿里maven私服配置和作品上传
- 基于环信的开源即时通讯项目
- 美国弗吉尼亚大学计算机科学,美国弗吉尼亚大学计算机科学专业
- Key exchange was not finished,connection is closed近期遇到这个错误sshd更新导致的
- Windows批处理文件*.bat
- 孙溟㠭凿印《猛击一掌》