设为首页 加入收藏

TOP

scala面向对象.高阶函数,柯里化,Actor编程简介(二)
2017-10-09 13:25:24 】 浏览:1164
Tags:scala 面向 对象 高阶 函数 柯里化 Actor 编程 简介
4.高阶函数

定义函数时格式:val 变量名 = (输入参数类型和个数) => 函数实现和返回值类型和个数
“=”表示将函数赋给一个变量
“=>”左面表示输入参数名称、类型和个数,右边表示函数的实现和返回值类型和参数个数

15.匿名函数

在Scala中,你不需要给每一个函数命名,没有将函数赋给变量的函数叫做匿名函数
arr.map(_ 2)
其中_
2就是一个匿名函数

16.柯里化

柯里化指的是将原来接受两个参数的方法变成新的接受一个参数的方法的过程

def m(x: Int)= (y: Int) =>xy
m: (x: Int)Int => Int
看起来比较奇怪即像方法又像函数,可以理解为一个方法的实现是 (y: Int) =>x
y这个函数

调用val func = m(3)后彻底变成了一个函数
func: Int => Int =

func(5)在调用这个函数并传递第二个参数,得到最终结果
Int=15

柯里化一般和隐式转换一起使用

16.隐式转换

隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。

隐式转换函数是指那种以implicit关键字声明的带有单个参数的函数

/隐式的增强File类的方法
class RichFile(val from: File) {
?? def read = Source.fromFile(from.getPath).mkString
}

object RichFile {
?? //隐式转换方法
?? implicit def file2RichFile(from: File) = new RichFile(from)
}

object MainApp{
??def main(args: Array[String]): Unit = {
???? //导入隐式转换
????import RichFile._
???? //import RichFile.file2RichFile
???? println(new File("c://words.txt").read)
??}
}

引入的隐式值>(优先级高于)默认值
如果导入的隐式值有多个同时满足参数会报错

17.泛型

多重界定符

/* 
  // 表示:A和B为T上界 
  T <: A with B 
   
  // 表示:A和B为T下界 
  T >: A with B 
   
  // 表示:同时拥有上界和下界,并且A为下界,B为上界,A为B的子类,顺序不能颠倒。 
  T >: A <: B 
   
  // 表示:类型变量界定,即同时满足AT这种隐式值和BT这种隐式值 
  T:A:B 
   
  // 表示:视图界定,即同时能够满足隐式转换的A和隐式转换的B 
  T <% A <% B  
*/  

具体泛型使用可见:
http://blog.csdn.net/yuan_xw/article/details/49363749

18.Actor编程

Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息(message)的发送、接收来实现多线程的。使用Scala能够更容易地实现多线程应用的开发。

在Scala中,我们可以通过复制不可变状态的资源(即对象,Scala中一切都是对象,连函数、方法也是)的一个副本,再基于Actor的消息发送、接收机制进行并行编程

19.Actor方法执行顺序

(1).首先调用start()方法启动Actor
(2).调用start()方法后其act()方法会被执行
(3).向Actor发送消息

20.发送消息的方式

! 发送异步消息,没有返回值。
!? 发送同步消息,等待返回值。
!! 发送异步消息,返回值是 Future[Any]。

21.
class AppleActor extends Actor {

??def act(): Unit = {
???? while (true) {
???? receive {
???????? case "start" => println("starting ...")
?? ??????case SyncMsg(id, msg) => {
?? ???????? println(id + ",sync " + msg)
?? ?? ?????? Thread.sleep(5000)
?? ?? ?????? sender ! ReplyMsg(3,"finished")
?? ?????? }
?? ??????case AsyncMsg(id, msg) => {
?? ?????? println(id + ",async " + msg)
?? ?????? Thread.sleep(5000)
?????? }
???? }
?? ??}
??}
}

object AppleActor {
??def main(args: Array[String]) {
???? val a = new AppleActor
???? a.start()
???? //异步消息
???? a ! AsyncMsg(1, "hello actor")
???? println("异步消息发送完成")
???? //同步消息
???? //val content = a.!?(1000, SyncMsg(2, "hello actor"))
???? //println(content)
???? val reply = a !! SyncMsg(2, "hello actor")
???? println(reply.isSet)
???? //println("123")
???? val c = reply.apply()
???? println(reply.isSet)
???? println(c)
??}
}
case class SyncMsg(id : Int, msg: String)
case class AsyncMsg(id : Int, msg: String)
case class ReplyMsg(id : Int, msg: String)

receive阻塞(内部阻塞队列),接受消息,
sender 拿到消息的发送者
isSet判断val中有没有值
apply()方法是同步的
react方法复用线程

while(true)和loop的效果一只狗

22.
读取文件内容source.fromFile(f)
f为文件内容

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇spark-shell简单使用介绍(scala) 下一篇在linux上安装Scala详细步骤

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目