`
Eastsun
  • 浏览: 308876 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java与Scala中的闭包

阅读更多
  原文地址Closures in Java and Scala
  翻  译Eastsun


  People argue that verbose code is easier to understand. Do you agree when reading these two examples, one method in Java, one in Scala?
  人们普遍认为,详细的代码更易于理解。但如果你阅读下面两段代码--一个使用Java另一个使用Scala--你是否还这样认为呢?
public List<Item> bought(User user) {
    List<Item> result = new ArrayList();
    for (Item item : currentItems) {
        if (user.bought(item)) {
            result.add(item);
        }
    }
    return result;
}

def bought(user: User) = items.filter(user bought _)


  If you are familiar with Java, which is more likely then you being familiar with Scala, you may tend to the Java-version. Scala has a different syntax for declaring types and generics, and supports closures, including anonymous parameters (the underscore).
  如果你熟悉Java,那么很可能你将会了解到Scala。也许你会倾向于使用Java的版本。Scala具有不同的类型声明以及泛型语法,并且支持闭包,以及匿名参数(下划线)。

  When Closures are introduced in one of the next Java releases, JDK 7 or 8, the example could be rewritten like this:
  在Java的后续版本中引入闭包后(JDK7或JDK8),上面Java版的代码可以重写为:
public List<Item> bought(User user) {   
    return ListUtils.filter(Item item : items ) {      
        user.bought(item);    
    }
}

  Or with extension methods:
  或者使用方法扩展
public List<Item> bought(User user) { 
    return items.filter(Item item : )  { 
        // <-- note the smily! thats what its all about!
        user.bought(item);
    }
}

  The interesting differences between Java with closures and Scala is the static typing: Scala inferences that items are all of type Item, so there is no need to specify that information again.

  带有闭包的Java与Scala一个让人感兴趣的区别是它们的静态类型:Scala的类型推断能力能得到其所有变量的类型,因此不需要再指明这一点。

  So, while the current Java Closures specification is a great step in the right direction, lead by Neil Gafter, who is quite the right man for the job, it may not be worth to wait for it, if you have the choice. Its not even sure yet that we'll see that spec implemented in JDK7, and even that is at best one and a half year away.
  因此,即便目前的JAVA闭包规范Neil Gafter的领导下正朝着正确的方向做出了很大的进步;但我们也未必需要去等待它,如果我们已经有了其他选择。何况JDK7中会不会实现闭包现在还没有确定--即便是,那也至少是一年半以后的事了。
分享到:
评论
2 楼 bloodrate 2008-08-18  
我说说我对闭包的理解,看看片面不,我理解的闭包是一个处理的输入和输出类型项相同,这样这次的输出就可以作为下次的输入在次处理。
说这个我想到了关于“关系数据库”和“对象数据库”的争论,关系数据库存储的数据,通过应用系统的持久层转化为对象模型是有很大困难的,这其中原因在于“关系”和“对象”的存储方式不同,但是关系模型之所以流行,和sql语句密不可分,sql本身遵循闭包原则,致使一次查询结果可以作为下次查询条件,人们可以指学习少量关键词就能拼装成很复杂的查询语句,闭包是数学名词,有着数学上的天然对称美。
至于java语言的闭包,我不完全理解,不过我相信就算jdk还没有提供,使用者也可以自己撰写自己的闭包类,现在我考虑的是java会不会加入语义级别的闭包。
1 楼 hity 2008-08-16  
刚刚试验了下java7:
class A{
    static { => int } answer = { => 42 };
    public static void main(String[] args) {
      int i = answer.invoke();
      System.out.println(i);
      int temp=new A().add({int x,int y=>x*x+y*y});
      System.out.println(temp);
    }
     public int add({ int,int=>int } s){
     return s.invoke(3, 4);
     }

}

相关推荐

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

    1. **类与对象**:Scala中的类和对象概念与Java类似,但更加简洁。例如,可以使用`object`关键字创建单例对象,这在Scala中非常常见。 2. **基本类型和操作**:Scala支持各种基本数据类型,如Int、Double等,并提供...

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

    总的来说,《IBM:面向Java开发人员的Scala指南》的第178页可能会详细讨论以上的一些概念,帮助Java开发者理解Scala的独特之处,掌握如何将这些特性应用到实际的项目中,以提升代码质量和开发效率。通过学习Scala,...

    面向Java开发者的Scala教程

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

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

    Java8与Scala中的Lambda表达式深入讲解 Lambda表达式是函数式编程的基本组成部分,许多现代编程语言都把它作为关键部分集成在语言中。Java8终于要支持Lambda表达式!在这篇文章中,我们将深入讲解Java8与Scala中的...

    SCALA程序设计-JAVA虚拟机多核编程实战

    5. 本书的结构与内容:本书主要讨论了Scala的函数式风格、自适应类型、闭包、XML处理、模式匹配和并发编程等核心内容,帮助读者快速掌握Scala并构建真实的应用程序。 6. 书籍的读者定位:本书主要面向想了解Scala的...

    scala sdk scala-2.12.3

    6. **IDE支持**:Scala SDK还与IntelliJ IDEA、Eclipse等集成开发环境集成,提供代码补全、调试和其他高级开发功能。 7. **类型系统**:Scala拥有强大的类型系统,包括类型推断、模式匹配、高阶类型和抽象类型等,...

    Scala程序设计:Java虚拟机多核编程实战1

    闭包是Scala中的另一个核心概念,它允许函数作为值传递,增强了代码的模块化和复用性。此外,XML处理在Scala中被集成得非常自然,使得数据交换和解析更为便捷。 模式匹配是Scala的一个特色,它允许开发者以优雅的...

    scala中文版

    Scala旨在提供简洁且表达力强的方式来编写程序,同时也能够无缝地与其他语言(如Java)交互。 Scala编程语言的设计者是Martin Odersky,他同时也是洛桑联邦理工大学(EPFL)的教授。Odersky博士致力于编程语言的...

    Scala考试题1

    15. **Java 集合与 Scala 集合的转换**: - 导入 `scala.jdk.CollectionConverters`,可以使用 `.asJava` 和 `.asScala` 转换。 16. **函数 values**: - 编写一个函数,根据给定区间和函数,生成对应的输入输出...

    scala-2.11.12 win msi 安装包

    8. **与Java兼容**:Scala是基于JVM的语言,可以调用所有的Java库,反之亦然,使得已有的Java代码能够与Scala代码一起工作。 9. **Akka框架**:Scala通常与Akka框架一起使用,提供高效、容错的并发处理能力。 10. ...

    Scala(中文完整版).zip

    它运行在Java虚拟机(JVM)上,能够无缝地与Java库和框架集成,这使得Scala在大数据处理、Web应用开发以及云计算等领域有广泛应用。 **1. Scala基本语法** Scala的语法简洁而富有表现力,支持变量声明、常量、函数...

    JGSK, Java,Groovy,Scala,Kotlin 四种语言的特点对比.zip

    Java是大型企业系统的基石,Groovy在自动化脚本和构建工具如Gradle中大显身手,Scala在大数据处理(如Apache Spark)领域独树一帜,而Kotlin则在移动开发和现代Web应用中展现出强大的生命力。选择哪种语言取决于项目...

    scala 语法参考中文pdf

    6. **Scala与其他技术的集成**:如与Java的互操作性,使用Scala进行Web开发(如Play框架),或者与大数据技术(如Spark)的结合。 这两份文档为学习Scala提供了一套全面的资源,涵盖了从基础到高级的各种主题,无论...

    scala2.12.1Windows镜像包

    - **互操作性**:Scala可以直接调用Java库,反之亦然,这得益于良好的Java互操作性。 - **编译器增强**:错误消息更加友好,新的警告提示帮助开发者编写更高质量的代码。 - **库和框架更新**:包括对Play ...

    scala-2.12.10.tgz

    6. Scala与Java互操作性:Scala可以在Java项目中无缝集成,因为它是JVM上的语言。可以调用Java库,反之亦然,这使得迁移现有Java项目到Scala变得容易。 7. 函数式编程:Scala支持高阶函数、闭包和不可变数据结构,...

    Scala安装包

    这个版本还提升了与Java库的互操作性,使得Java和Scala之间的协同开发变得更加顺畅。 对于Windows用户,安装Scala通常涉及到下载`.msi`安装文件,双击后按照向导指示进行安装。安装过程中,你可以选择安装路径,...

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

    8. **Dotty 和 Scala 3**:Scala 社区正在开发下一代 Scala 版本——Scala 3(以前称为 Dotty),它旨在解决 Scala 2 中的一些复杂性和不一致性,提供更好的互操作性与简化语法。 9. **Scalactic 和 ScalaTest**:...

Global site tag (gtag.js) - Google Analytics