第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读

隐式转换函数
implicit def function
例如
implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])

scala> class Person(val name: String)
defined class Person

scala> class Enginner(val name: String, val salary: Double) {
| def code = println(name + " Coding ...")
| }
defined class Enginner

scala> implicit def person2Engineer(p: Person):Enginner = {
| println("person2Enginner " + p.name)
| new Enginner(p.name, 1000)
| }
warning: there were 1 feature warning(s); re-run with -feature for details
person2Engineer: (p: Person)Enginner

scala> def toCode(p: Person) {
| p.code
| }
toCode: (p: Person)Unit

scala> toCode(new Person("Scala"))
person2Enginner Scala
Scala Coding ...

package com.dt.scala.implicits

import scala.io.Source
import java.io.File

class RicherFile(val file: File) {
def read = Source.fromFile(file.getPath()).mkString
}

class File_Implicits(path: String) extends File(path)
object File_Implicits {
implicit def file2RicherFile(file: File) = new RicherFile(file)
}

object Implicits_Internals {
def main(args: Array[String]) {
var file = new File_Implicits("content.txt")
println(file.read)
}
}

隐式参数类型的伴生对象中去找隐式值

隐式参数
scala> class Level(val level: Int)
defined class Level

scala> def toWorker(name: String) (implicit level: Level) {
| println(name + " : " + level.level)
| }
toWorker: (name: String)(implicit level: Level)Unit

scala> implicit val level = new Level(8)
level: Level = [email protected]

scala> toWorker("Spark")
Spark : 8

package com.dt.scala.implicits

object Context_Implicits {
implicit val default: String = "Flink"
}

object Param {
def print(content: String)(implicit language: String) {
println(language + " : " + content)
}
}

object Implicit_Parameters {
def main(args: Array[String]) {
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 uint: T
}

object Implicits_Object {
def main(args: Array[String]) {
implicit object StringAdd extends SubTemplate[String] {\
override def add(x: String, y: String) = x concat y
override def unit: String = ""
}
implicit object IntAdd extends SubTemplate[Int] {\
override def add(x: Int, y: Int) = x + y
override def unit: Int = 0
}
def sum[T](xs: List[T])(implicit m: SubTemplate[T]): T =
if(xs.isEmpty) m.unit
else m.add(xs.head, sum(xs.tail))

println(sum(List(1,2,3,4,5)))
println(sum(List("Scala","Spark","Kafka")))
}
}

import java.io.File
import scala.io.Source

object Context_hepler {
implicit class FileEnhancer(file: File) {
def read = Source.fromFile(file.getPath).mkString
}

implicit class Op(x: Int) {
def addSAP(second: Int) = x + second
}
}

object Implicits_Class {
def main(args: Array[String]) {
import Context_Helper._
println(1.addSAP(2))
println(new File("context.txt").read)
}
}

Java共享全局变量的加锁机制
Scala使用Actor实现并发编程

scala> import scala.actors.Actor
import scala.actors.Actor

scala> class HiActor extends Actor {
| def act(){
| while(true){
| receive {
| case name: String => println(name)
| }
| }
| }
| }
defined class HiActor

scala> val actor = new HiActor
actor: HiActor = [email protected]

scala> actor.start()
res3: scala.actors.Actor = [email protected]

scala> actor ! "Spark"

scala> Spark

scala> case class Basic(name: String, age: Int)
defined class Basic

scala> case class Worker(name: String, age: Int)
defined class Worker

scala> 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)
| }
| }
| }
| }
defined class BasicActor

scala> val b = new BasicActor
b: BasicActor = [email protected]

scala> b.start
res5: scala.actors.Actor = [email protected]

scala> b ! Basic("Scala", 13)

scala> Basic Information Scala , 13

scala> b ! Worker("Hadoop", 15)
Worker Information Hadoop , 15

!? 发送消息 必须等到Actor消息处理完
!! 发送消息,未来某个时间获得结果

首先,我要说明下,我的笔记及作业都来自王家林老师的大数据门徒3000课程,希望大家多多关注,里面都是经典,这里是老师的电子名片:

时间: 2024-08-02 15:14:50

第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读的相关文章

大数据学习:Scala隐式转换和并发编程(DT大数据梦工厂)

很多Spark代码中使用了隐式转换.隐式参数.隐式类.隐式对象 如果不掌握,基本在读写复杂代码的时候读不懂 并发编程,怎么样进行高效并发,相互之间怎么通信,Spark这种分布式并发肯定非常重要 (Actor.Akka) ==========隐式转换函数============ 可以手动指定将某种类型的对象转换成其它类型的对象或者类 转换原因:假设制定好接口 比如File,我们想要File.dtSpark的方法,在JAVA中不行 如果在Scala里面我们可以进行升级,将File编程其它类型,就用之

Scala隐式转化和并发编程

1.Scala隐式彻底详解 隐式转换 implicit ,可通过手动指定将某种类型的对象或者某种类转换成其他类型的类或者对象 形式:implicit def function 隐式函数.隐式参数.隐式对象.隐式类 隐式函数:指有implicit前置修饰的函数 Scala会根据上下文,利用隐式转换函数的签名主要是输入类型,在程序运行时利用隐式转换函数,将接受的隐式函数参数类型定义的对象自动升级转换成隐式转换后的对象.转换成另外一种对象返还,任务完成后重新转换为原来类型.如果调用对象没有要调用的方法

Scala隐式转换

概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.本文原文出处: http://blog.csdn.net/bluishglc/article/details/50866314 严禁任何形式的转载,否则将委托CSDN官方维护权益! 隐式转换有四种常见的使用场景: 将某一类型转换成预期类型 类型增强与扩展 模拟新的语法 类型类 语法 隐式转换有新旧两种定义方法,旧的定义方法指是的"impli

Scala隐式转换类遇到的问题

今天练习Scala的隐式转换类遇到的一个问题,测试代码如下: object ImplcitTest { def main(args: Array[String]) { import Context._ val person1 = User("zhangsan") println(person1.getStr()) val filePath = Thread.currentThread.getContextClassLoader.getResource("test.txt&qu

第3课 Scala函数式编程彻底精通及Spark源码阅读笔记

本课内容: 1:scala中函数式编程彻底详解 2:Spark源码中的scala函数式编程 3:案例和作业 函数式编程开始: def fun1(name: String){ println(name) } //将函数名赋值给一个变量,那么这个变量就是一个函数了. val fun1_v = fun1_ 访问 fun1_v("Scala") 结果:Scala 匿名函数:参数名称用 => 指向函数体 val fun2=(content: String) => println(co

scala 隐式转换

隐式转换第一例

记录: 一次解决整型溢出攻击(使用scala,隐式转换)

最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议购买该物品 306783379 个 于是服务器收到请求进行以下处理 val num = message.getInt("num") //获得客户端发送来的 306783379 val cost = num * produc.price  //这里没有校验物品的数量就直接计算总价了. 所以总

Scala模式匹配、类型系统与Spark源码阅读

java switch-case(对值) scala不仅对值,而且可以对类型,集合(map,list元数据匹配),object,class scala大量使用模式匹配(match case) Scala的模式匹配,与Java的switch case的区别: 1.不仅可以匹配值,可以匹配类型 2.可以匹配数组的集合 相同数组.长度相同的数组.以某个元素开头的数组 对于长度相同的数组,会进行自动变量赋值 3.匹配class - 样例类case class 类似于Java里的Bean 一般都不可改变,

第2集:Scala面向对象彻底精通及Spark源码阅读

定义类class HiScala {private var name = "Spark"def sayName(){println(name)}def getName=name} 实例化类scala> val scal = new HiScalascal: HiScala = [email protected] 调用类的方法scala> scal.sayName()Spark scala> scal.getNameres6: String = Spark class