`
medbricom
  • 浏览: 104845 次
  • 性别: 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  “里面的...

    面向Java开发人员的Scala指南

    然而,Scala的语法更为简洁,且支持更多高级编程概念,如模式匹配、高阶函数和类型推断。对于Java开发者来说,这些新特性可能需要一定的学习曲线,但一旦掌握,可以显著提升开发效率。 1. **类型系统**:Scala的...

    Java中的函数式编程_Java_Scala_下载.zip

    Java 8的`Function`, `Predicate`, `Consumer`等接口就是高阶函数的体现,它们允许我们编写更加简洁的代码。 3. **不可变数据**:在函数式编程中,数据通常是不可变的,一旦创建就无法更改。Java的`Stream API`鼓励...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    例如,使用函数式编程可以简化创建对象的过程,通过高阶函数实现单例模式,以及利用反应式编程替代事件驱动。 【适用人群】 这本书适合有编程基础,对函数式编程感兴趣的读者,无论你是Java开发者还是对新编程范式...

    面向Java开发人员Scala指南,Scala和servlet的比较

    例如,Java中的servlet需要重写多个方法如`doGet`和`doPost`,而在Scala中,可以通过高阶函数和模式匹配来简化这些操作。 其次,Scala支持函数式编程。这使得代码更易于测试和维护,因为函数式编程强调无副作用和纯...

    Java 面向对象和函数式编程的混合和scala的比较.pdf

    在 Scala 示例中,`filter` 方法的实现是一个高阶函数,接受一个参数为 `(T) =&gt; Boolean` 类型的函数,这是 Scala 中的函数类型。在 Java 中,对应的接口是 `Predicate&lt;T&gt;`,它需要显式地声明并实现接口,代码相对...

    面向Java开发者的Scala教程

    - **函数式编程**:Scala支持高阶函数、闭包和模式匹配等函数式编程特性,这些在Java中需要借助额外的库或Java 8及以上版本的Lambda表达式实现。 - **案例类和模式匹配**:Scala的案例类和模式匹配提供了处理数据...

    Java8与Scala中的Lambda表达式深入讲解

    * 高阶函数:Scala支持高阶函数,允许开发者将函数作为参数传递或作为返回值。 * 闭包支持:Scala支持闭包,允许函数访问直接词法作用域之外的变量。 * 类型推论支持:Scala支持类型推论,能够自动推断出类型,简化...

    scala中文教程(java 平台开发语言 scala 简单教程)

    2. **面向对象与函数式编程的融合**:Scala支持类、对象、继承等面向对象的概念,同时也提供了高阶函数、闭包等函数式编程的特性。 3. **轻量级语法**:Scala的语法简洁明了,使得API调用几乎不需要额外的语法开销。...

    SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)

    它运行在Java虚拟机上,与Java代码完全兼容,但提供了更高级的语法和特性,如类型推断、高阶函数、模式匹配等。在SpringBoot项目中,Scala可以作为Java的补充,用于编写更简洁、更强大的业务逻辑。 【Scala混编】 ...

    IBM:面向Java开发人员的Scala指南-p178.7z

    高阶函数、闭包、柯里化(Currying)和尾递归等概念都是Scala的内置特性。这些特性使得代码更加简洁、可读,并且有利于并行计算。例如,Scala的集合库是完全函数式的,可以进行无副作用的操作,这对于处理大数据和...

    spark源码之scala基础语法demo

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

    scala-2.13.8 解压安装版

    - **高阶函数**:函数可以作为值传递,也可以作为其他函数的参数或返回值。 - **模式匹配**:通过模式匹配,可以对数据结构进行解构并根据不同的情况执行不同的操作。 - **案例类**:简化了模式匹配,它们自动...

    面向 Java 开发人员的 Scala 指南

    它支持类、继承等面向对象编程特性,同时也支持高阶函数、不可变数据结构等函数式编程元素。这种混合型的编程模型使得开发者可以根据项目的具体需求选择最适合的方法。 - **可扩展性**:Scala是一种高度可扩展的语言...

    Scala_中文学习资料_含Scala_2.7.6_API.rar

    这些章节涵盖了Scala的基础概念,如基本语法、类型系统、对象和类、模式匹配、函数和高阶函数等。对于初学者来说,这些章节提供了很好的指导,帮助他们快速上手Scala编程。 "面向Java开发人员的Scala指南-p178.pdf...

    scala sdk scala-2.12.3

    同时,Scala还提供了函数式编程的关键概念,如高阶函数、闭包和柯里化。 10. **Actor模型**:Akka库是Scala中的并发和分布式计算框架,基于Actor模型,使得编写高性能、容错的应用程序变得简单。 11. **Dotty/...

    面向 Java 开发人员的 Scala 指南系列.rar

    7. **匿名函数和 Lambda 表达式**:Scala 支持简洁的匿名函数写法,这在处理高阶函数时非常方便,类似 Java 8 的 Lambda 表达式。 8. **Dotty 和 Scala 3**:Scala 社区正在开发下一代 Scala 版本——Scala 3(以前...

    Scala(中文完整版).zip

    函数定义可以使用匿名函数和高阶函数,类和对象通过case class和trait实现。 **2. 面向对象编程** Scala的面向对象特性包括类、继承、封装和多态。类通过`class`关键字定义,可以有构造器、方法和属性。继承使用`...

    Scala中文版

    3. **函数式编程**:Scala提供了丰富的高阶函数和不可变数据结构,使得编写纯函数变得容易,有助于写出更简洁、可读性强且易于测试的代码。 4. **表达式和模式匹配**:Scala中的几乎一切都是表达式,这意味着每个...

Global site tag (gtag.js) - Google Analytics