文档章节

Scala的那些匿名函数

通九互联科技
 通九互联科技
发布于 2015/02/27 12:46
字数 412
阅读 103
收藏 1
点赞 0
评论 0

首先是常用的匿名函数

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

【Scala篇】--Scala中的函数

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

LHWorldBlog ⋅ 02/09 ⋅ 0

Scala基础语法

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

岁月留痕 ⋅ 2015/12/08 ⋅ 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 ⋅ 0

Scala函数式编程_function & method

Scala函数式编程_function & method Function 和 Method 传递性上的区别 method——指的是在trait、class、object中以def关键字声明的,它不能被直接传递。 function——类型为 ParamsType=>...

秋风醉了 ⋅ 2014/12/30 ⋅ 0

Scala初学-20160109

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

蓝狐乐队 ⋅ 2016/01/09 ⋅ 0

Scala之偏函数Partial Function

本文原文出处: http://blog.csdn.net/bluishglc/article/details/50995939 严禁任何形式的转载,否则将委托CSDN官方维护权益! 从使用case语句构造匿名函数谈起 在Scala里,我们可以使用cas...

bluishglc ⋅ 2016/03/28 ⋅ 0

C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议。那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊。而很多时候,Implicit的很多规则会让新...

LeeHappen ⋅ 01/04 ⋅ 0

Scala学习笔记 - 函数

Scala学习笔记 - 函数 OneCoder2016-09-2157 阅读 Scala Scala做为支持函数式编程的语言,函数自然是其核心的特性,因此笔者对函数部分的学习自然会更加认真细致一些。但也仅仅是基础部分。 ...

OneCoder ⋅ 2016/09/21 ⋅ 0

【Spark亚太研究院系列丛书】Spark实战高手之路-第2章动手实战Scala第1小节(2)

2,Scala函数特性编程实战 当函数不带参数的使用,我们调用的时候可以省略括号: 接下来定义一个匿名函数、调用并运行: 在Scala总函数式一等公民 ,所以我们可以把函数付给一个常: 另外一个...

Spark亚太研究院 ⋅ 2014/11/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 39分钟前 ⋅ 4

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部