文档章节

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,还有很多不深入的地方,望高手们多多指点。

© 著作权归作者所有

共有 人打赏支持
通九互联科技
粉丝 133
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

Andrew Ng教你如何引领公司进入AI时代

摘要: 人工智能时代,企业转型遇到困难?看看Andrew Ng的建议吧! AI(人工智能)技术就像100年前的电力一样,正准备改变每个行业。从现在到2030年,它将创造约13万亿美元的GDP增长。虽然它...

阿里云官方博客
8分钟前
0
0
斗图咖(www.doutuka.com)上线纪念

网站名称:斗图咖 网站描述:是一款年轻人都在玩的斗图网站,来斗图咖一起斗图装逼交朋友吧。站长每天上传收集的最新最火斗图,供大家娱乐聊天发表情;后期也会开发表情自主设计,自己设计表...

focusone
29分钟前
3
0
Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
40分钟前
5
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
46分钟前
2
0
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部