文档章节

Scala的那些匿名函数

通九互联科技
 通九互联科技
发布于 2015/02/27 12:46
字数 412
阅读 104
收藏 1

首先是常用的匿名函数

BNF描述如下

Expr ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr
ResultExpr ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block
Bindings ::= ‘(’ Binding {‘,’ Binding} ‘)’
Binding ::= (id | ‘_’) [‘:’ Type] 

常见使用方式如下

x => x  //只有一个参数,并且结果是这个参数自身
f => g => x => f(g(x)) //科里化的匿名函数
//非匿名的写法 def curry(f:AnyRef => AnyRef)(g:AnyRef=>AnyRef)(x:AnyRef):AnyRef = f(g(x))                       
(x: Int,y: Int) => x + y //最常用的形式

() => { count += 1; count } //参数列表为空,使用一个非局部的变量count,加1后返回

_=>5 //忽略所有参数,直接返回定值

接着是模式匹配匿名函数

BNF描述如下

BlockExpr ::= ‘{’ CaseClauses ‘}’ 
CaseClauses ::= CaseClause {CaseClause}
CaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Block 

常见使用方式如下

scala.PartialFunction[S, T] { 
    def apply(x: S): T = x match {
        case p1 =>b1 ... case pn =>bn					
    }
    def isDefinedAt(x: S): Boolean = {
        case p1 => true ... case pn => true				
        case _ => false
    }
}  //这是scala中PartialFunction 实现方式

def scalarProduct(xs: Array[Double], ys: Array[Double]) =
(0.0 /: (xs zip ys)) {			
    case (a, (b, c)) => a + b * c
} 
其中case的内容,相当于下面的匿名函数				
(x, y) => (x, y) match {
    case (a, (b, c)) => a + b * c					
} 

下面的代码是我自己些的一段测试

class Sample {
  println("You are constructing an instance of Sample")
}
object Sample {
  def foo(a: Int)(f:(Int,Int) => Int): Int =  {
    f(a,3)
  }
  def foo2(a: Int)(f:(Int)=>Int):Int = {
    f(3)
  }
  def main(args: Array[String]) = {
    new Sample
    val n = (a:Int,c:Int) => {
        println(a)
        a * c
    }
    val b = foo(2) _
    val m = b(n)
    println(m)
    val c = foo2(3){ 
      z =>
          println(z)
          z + 1
    }
    println(c)
  }
}


刚开始完Scala,还有很多不深入的地方,望高手们多多指点。

© 著作权归作者所有

共有 人打赏支持
通九互联科技
粉丝 130
博文 38
码字总数 21941
作品 1
大连
个人站长
Scala function literals && anonymous functions

Scala function literals && anonymous functions 参考资料: http://java.dzone.com/articles/scala-function-literals http://stackoverflow.com/questions/3878347/right-arrow-meanin......

秋风醉了
2014/12/22
0
0
【Scala篇】--Scala中的函数

一、前述 Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。 二、具体函数 1、Scala函数的定义 def fun (a: Int , b: Int ) : Unit = {println(a+b...

LHWorldBlog
02/09
0
0
Scala基础语法

Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃 Java 这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类库...

岁月留痕
2015/12/08
35
0
scala匿名函数

匿名函数在spark用的很多,经典用法就是: 匿名函数赋值给常量:var add = (a:Int, b:Int) => a + b; 匿名函数赋值给函数:def add = (a:Int, b:Int) => a + b; 然后就可以直接用add(2,3)了。...

cjun1990
2015/09/10
375
0
Scala初学-20160109

概念 scala是一门类java的语言,可以直接使用java类库。 Scala运行是编译成java字节码,可以运行在任何标准的JVM虚拟机上 初识: 运行Scala解释器: scala> 1 + 1 res0: Int = 2 res0是解释器...

蓝狐乐队
2016/01/09
68
0

没有更多内容

加载失败,请刷新页面

加载更多

python进制转换

#进制转换print(bin(10)) #十进制转换成二进制print(oct(10)) #十进制转换成八进制print(hex(10)) #十进制转换成十六进制print(int('1010',2)) #二进制转十进制print(int(...

fadsaa
13分钟前
0
0
syntax error near unexpected token

最近不断重复在虚拟机CentOS测试安装gitlab,因为gitlab有一个脚本需要饭强才能下载,于是我先在windows下载好再上传到虚拟机,可是执行脚本的时候提示“syntax error near unexpected toke...

W_Lu
23分钟前
1
0
Redis基础、高级特性与性能调优

本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概览Redis提供的高级能力,并在部署、维护、性能调优等多个方面进行更深入的介绍和指导...

Java干货分享
24分钟前
1
0
Redis使用lua脚本实现increase + expire 的原子操作

lua脚本: public Integer incrEX(String key, long defaultExpire){ String script = "local current = redis.call('incr',KEYS[1]);" + " local t = redis.call......

大海201506
25分钟前
0
0
Dubbo 源码分析(一)一环境搭建

环境搭建的步骤有哪些 依赖外部的环境 使用的开发工具 源码的拉取 结构大致介绍 1 依赖的外部环境 安装JDK 安装Git 安装maven 这边我们就不介绍怎么安装这些外部环境了,大家自行从安装这些外...

小刀爱编程
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部