`
medbricom
  • 浏览: 103407 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java8 和 Scala 中的高阶函数

    博客分类:
  • java
阅读更多
函数文本最大的优势就是可以像字符串或者对象等其他文本(literal)一样传送它。这种特性为构建高度紧凑和可重用代码提供无限的可能性。

1、我们的第一个高阶函数

当我们将一个函数文本传送给一个方法的时候,我们最主要的是一个接收方法参数的方法(这个确实很绕-_-|||),这类方法就叫做高阶函数。上文Swing例子中提到的 addActionListener 方法恰好属于这类。我们还可以定义自己的高阶函数来为自己提供许多便利。让我们看一个简单的例子:

def measure[T](func:=>T):T { 
    val start = System.nanoTime() 
    val result = func 
    val elapsed = System.nanoTime() - start; 
    print("The execution of this call took: %s ns".format(elapsed)); 
    result 
}
在这个例子中,我们声明了一个名为measure的方法用来计算这个名为func的函数文本的回调所需要的时间。func 方法的签名(signature)是它不接收任何参数并且返回一个泛型类型T。正如你所看到的,Scala中的函数并不一定需要参数尽管它们能够——而且往往也含有参数。

现在我们可以向 measure 方法中传递任何函数文本(或者方法)。

def myCallback = { 
    Thread.sleep(1000) 
    "I just took a poewrnap"
}  
val result = measure(myCallback);  
> The execution of this call took: 100244900 ns
从概念的角度讲我们所做的,就是将计算方法调用时间和实际的运算区分开来。我们构造了两块可以重用、松散耦合、类似于拦截器(interceptor)的代码块(measure和myCallback)

2、通过高阶函数实现重用

先看一个假设的例子,两个可重用构造略紧耦合:

def doWithContact(fileName:String, handle:Contact => Unit):Unit = { 
    try { 
        val contactStr = io.Source.fromFile(fileName).mkString 
        val contact = AContactParser.parse(contactStr) 
        handle(contact) 
    } 
    catch { 
        case e: IOException => println("couldn't load contact file: " + e); 
        case e: ParseException => println("coulnd't parse contact file: " + e); 
    } 
}
doWithContact 方法从文件中读取电子名片之类的联系方式然后将数据提供给一个解析器(parser)将数据转化成为联系领域的对象。然后这个对象被传递给一个函数文本回调 handle。 doWithContact 方法 很函数文本均返回 Unit 类型,等同于java中的返回void的方法。

现在,我们可以定义各种各样的可以传递给 doWithContact 的回调函数:

val storeCallback = (c:Contact) => ContactDao.save(c) 
val sendCallback = (c:Contact) => { 
    val msgBody = AConverter.convert(c) 
    RestService.send(msgBody) 

val combineCallback = (c:Contact) => { 
    storeCallback(c) 
    sendCallback(c) 

doWithContact("custerX.vcf", storeCallback) 
doWithContact("custerY.vcf", sendCallback) 
doWithContact("custerZ.vcf", combineCallback) 
doWithContact("custerZ.vcf", combineCallback)
回调函数也可以通过内联传递:

doWithContact("custerW.vcf", (c:Contact) => ContactDao.save(c))
3、Java 8 中的高阶函数

java 8 中的等效实现看起来十分相似——使用目前的语法建议:

public interface Block<T> { 
    void apply(T t); 

public void doWithContact(String fileName, Block<Contact> block) { 
    try { 
        String contacStr = FileUtils.readFileToString(new File(fileName)); 
        Contact.apply(contact); 
        block.apply(contact); 
    } 
    catch (IOException e) { 
        System.out.println("cloudn't load contact file: " + e.getMessage()); 
    }    
    catch (ParseException e) { 
        System.out.println("cloudn't parse contact file: " + e.getMessage()); 
    } 

//usage 
doWithContact("custerX.vcf", c -> ContactDao.save(c))
4、使用高阶函数的益处

正如你见到的,函数帮助我们干净地将对象的创建和处理区分开来。通过这种方法,新的业务逻辑处理对象就可以轻易的添加进来而没有必要同对象创建逻辑相耦合。

结果就是,我们通过使用高阶函数来使我们的代码保持DRY(Dont't Repeat Yourself) 因而,程序员可以从一个非常细粒度的代码重用中获得最佳利益。

原文链接:http://my.oschina.net/atttx123/blog/66812
0
3
分享到:
评论

相关推荐

    Scala函数式编程

     “Scala和Java8开发者的函数式编程指南!”  ——William E. Wheeler, TekSystems  “本书向你展示了提升Scala技能的方法和理念,它已超过‘更好的Java’。”  ——Fernando Dobladez, Code54  “里面的...

    spark源码之scala基础语法demo

    scala是一种基于JVM的面向对象的函数编程,scala编程相对于...2:函数式编程,柯里化函数,匿名函数,高阶函数等。 3:代码行简单。 4:支持并发控制,Actor Model机制 5:目前比较流行的kafka,spark均由scala开发。

    Scala语言规范-2019.rar

    Scala语言规范-Scala 是一...Scala 也是一门函数式变成语言,每个函数都是一个值,原生支持嵌套函数定义和高阶函数。 Scala 也支持一种通用形式的模式匹配,模式匹配用来操作代数式类型,在很多函数式语言中都有实现。

    spark从入门到实战

    第1章:SCALA编程(一) 1.大数据分析框架概要、Spark课程学习计划及建议 2.为什么学习SCALA语言及SCALA语言介绍和学习提纲 ...15.高阶函数定义与使用 16.深入高阶函数的使用 。。。。。。。。。。。。。。

    java8stream源码-hello-scala:你好-scala

    函数式编程语言不可变性,高阶函数和函数组合` 一个更好的网络资源来逐步学习 SCALA 关于 Scala 的一些重要信息 它是由 Martin Odersky(javac 之父)创建的现代 jvm 平台编程语言,受 Java、Ruby、Smalltalk、ML、...

    快学 scala 中文版 带完整目录

    12.5 一些有用的高阶函数 180 12.6 闭包 181 12.7 SAM转换 182 12.8 柯里化 183 12.9 控制抽象 185 12.10 return表达式 186 练习 187 第13章 集合 A2191 13.1 主要的集合特质 192 13.2 可变和不可变集合 ...

    Kotlin 中文文档.pdf

    函数 高阶函数和lambda表达式 内联函数 其它 多重申明 Ranges 类型检查和自动转换 This表达式 等式 运算符重载 空安全 异常 注解 反射 动态类型 参考 API 语法 互用性 Introduction 6 与 java 交互 工具 Kotlin代码...

    Scala 初学指南

    语法简洁,往往比Java少至少...支持高阶函数、Curry化、lambda运算等函数运算概念。 函数式风格要求函数尽量无副作用,这样一方面适合做单元测试来验证程序的正确性,另外很适合做并行计算! 可以满足大多数OOP编程需求

    google-oauth-ember-play-scala:使用Scala Play 2.4中的Google OAuth 2.0在Ember.js中呈现的Google Spreadsheets

    隐含值,高阶函数和用于更干净,更安全代码的选项。 在具有Java互操作性的Scala中使用Java软件包。 Scala Play中的Google OAuth 2.0。 GoogleSpreadsheet API的Scala包装器。 前端: ES6功能和语法。 Ember-...

    java图书馆swing源码-scala-for-the-impatient:“不耐烦的Scala”练习的解决方案

    java图书馆swing源码Scala ...高阶函数 (L1) 集合 (A2) 模式匹配和案例类 (A2) 注释 (A2) XML 处理 (A2) 类型参数 (L2) 高级类型 (L2) 解析和领域特定语言 (A3) 演员 (A3) 隐式 (L3) 定界续行 (L3)

    Kotlin 语言参考文档 中文版

    高阶函数与 Lambda 表达式 内联函数(Inline Function) 其他 解构声明(Destructuring Declaration) 集合(Collection) 值范围(Range) 类型检查与类型转换 this 表达式 相等判断 操作符重载(Operator overloading) Null...

    价值上万的视频教程互联网程序开发+大数据+Hadoop、hive、Spark

    · 高阶函数 · 特质 · 注解&类型参数 · 隐式转换 · 高级类型 · 案例实操 Spark Core · 安装部署 · RDD概述 · 编程模型 · 持久化&检查点机制 · DAG · 算子详解 · RDD编程进阶 · 累加器&...

    scala-nespresso:Nespresso 的 Scala 演示

    高阶函数 注意:对于那些需要加快速度的人,我在下面添加了一些链接 目的是提供最近 Scala 功能的具体实际用途。 我们将涵盖以下几点: 构建工具:SBT 地狱或 maven 冗长 字符串插值 具有隐式值类的开闭原则 类型类...

    大数据—Scala

    二、课程内容和目标本课程重点讲解Scala核心编程,内容包括: Scala语言概述、运算符、程序流程控制、数据结构之集合、Map映射、过滤、化简、折叠、扫描、拉链、视图、并行集合、高阶函数、函数柯里化、偏函数、参数...

    快速了解Scala技术栈

    而Scala程序员,却早就在享受lambda、高阶函数、trait、隐式转换等带来的福利了。Java像是一头史前巨兽,它在OO的方向上几乎走到了极致,硬将它拉入FP阵营,确乎有些强人所难了。而Scala则不,因为它的诞生就是OO与...

    Kotlin 语言文档

    高阶函数和 lambda 表达式 78 内联函数 82 协程 85 其他 89 解构声明 89 集合:List、Set、Map 91 区间 92 2类型的检查与转换“is”与“as” 94 This 表达式 96 相等性 97 操作符重载 98 空安全 102 异常 104 注解 ...

    coffee-monad

    Monad是在Haskell中引入的,但是任何支持高阶函数的语言都可以实现Monad,例如Javascript / Coffeescript单子类型类类型类是Haskell中的一个概念。 您可以将其视为Java中的接口。 Monad类型类定义了两个函数,即...

    form-follows-function:F3程式设计语言

    高阶函数。 高阶泛型。 隐式重视la Scala。 // Hopefully, the syntax is nearly self explanatory, but here are the likely unfamiliar bits: // // ..a means all subtypes of a, i.e. it's an upper bound // ...

    stream-processing

    流处理这是将“Scala 中的函数式编程”一书第 15 章中的流处理器(转换器)从 Scala 移植到 Java 的尝试。 我已经完成了 15.3.1,接下来将继续学习 15.3.2(确保资源安全)。 缺少高阶类型意味着 15.3.1 中的可扩展...

Global site tag (gtag.js) - Google Analytics