`

Java7准备让函数成为一等公民

    博客分类:
  • Java
阅读更多

     如果你是一个Java程序员,你认识#么?让我猜猜看,应该不太熟吧。因为在Java1.4.2时代,“#”仅仅用于在编写javadoc的注释内容,用于链接(@see)到对应类的具体方法。除此之外,在编写代码的时候,我们几乎不会用到它。

 

     不过,别惊讶,在Java7发布之后,“#”或许将成为Java程序员最熟悉的朋友!因为在几天前,SunJava SEOpenJDK的首席工程师Mark Reinhold,刚刚宣布Java7将加入一个简化版的闭包特性,其中的关键符号,就是“#”。也因为这个原因,Java7的正式发布时间,将从20102月份,推迟到9月份。

  

Java7中,“#”将让函数方法,成为Java语言的一等公民。下面来看看如何用#语法实现闭包的吧: 

 

简单的方法引用示例:

 

    比如要引用String类的equals方法,应该这么写:

 String#equals(Object)

     再看一个例子:

 java.io.File#exists()   

    事件监听器1 (代码示例,来自Cay Horstmann)

    使用闭包前:  

button.addActionListener(

    new ActionListener() {     

        public void actionPerformed(ActionEvent ){     

            System.out.println("Hi!"); }

        }

);

    

    使用闭包后 :   

button.addActionListener(#(ActionEvent e) System.out.println("Hi!));

      

    事件监听器2(代码示例,来自FSM )

     使用闭包前:

 public void init() {
    JButton button = ...;
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        handleAction(ev);
      }
    });
  }
  public void handleAction(ActionEvent ev) {
    // handle event
  }

 

使用闭包后:

  public void init() {
    JButton button = ...;
    button.addActionListener(this#handleAction(ActionEvent));
  }
  public void handleAction(ActionEvent ev) {
    // handle event
  }

 

 

   排序比较器(代码示例,来自FSM Cay Horstmann)

    使用闭包前:

 List<String> list = ...
  Collections.sort(list, new Comparator<String>() {
    public int compare(String str1, String str2) {
      return str1.length() - str2.length();
    }
  });

   使用闭包后:  

   List<String> list = ...
  Collections.sort(list, #(String str1, String str2) {
    return str1.length() - str2.length();
  });

 

   甚至或简化成: 

Collections.sort(strings,

#(String a, String b) a.length() - b.length()); 

     最后,我们复习一下javadoc中的#的用法

 

引用当前类的成员字段、方法、构造器

@see  #field

@see  #method(Type, Type,...)

@see  #method(Type argname, Type argname,...)

@see  #constructor(Type, Type,...)

@see  #constructor(Type argname, Type argname,...)

 

引用已经导入的类的成员字段、方法、构造器,或嵌套类

@see  Class#field

@see  Class#method(Type, Type,...)

@see  Class#method(Type argname, Type argname,...)

@see  Class#constructor(Type, Type,...)

@see  Class#constructor(Type argname, Type argname,...)

@see  Class.NestedClass

@see  Class

 

引用其他包里的类成员

@see  package.Class#field

@see  package.Class#method(Type, Type,...)

@see  package.Class#method(Type argname, Type argname,...)

@see  package.Class#constructor(Type, Type,...)

@see  package.Class#constructor(Type argname, Type argname,...)

@see  package.Class.NestedClass

@see  package.Class

@see  package

  

     以前曾经翻译过一篇文章离开Java,寻找更佳语言的10大理由(更新),现在看来Java或许已经听到了太多这样的声音。因此,在Java7中,里面提到的大部分问题都得到了改进,甚至包括现在突然宣布要加入的闭包,并让函数成为一等公民。这应该是一件好事,只是,有个小小的疑惑,Java似乎越来越像Ruby这样的动态语言了,Java7还会是我们熟悉的Java么? 

1
1
分享到:
评论
10 楼 sxgkwei 2011-09-16  
这就算所谓的闭包?貌似没有解决什么以前不能解决的新问题嘛。看了上面的,貌似闭包实现的东西,也都是以前可以找到对应实现的东西。那还引入闭包有什么意义?引入一个新东西,就要解决一个新问题,像上面这样的引入,最终的效果就是:明明完成的是同一个事情,却一大堆的不同写法,只能搞的概念混乱,写的人写的头晕,看的人看的眼晕。难道引入的最终目的是程序猿折磨程序猿?好奇中。。。
9 楼 pig345 2010-05-18  
系统(语言、平台)发展到中后期的典型表现:
越来越想把所有东西都包括进去,同时还要兼容原来的特性。。。
因为一些新特性天然与最初设计时考虑的完全不同,而为了兼容又不能彻底改变原设计,这样的东西多了,最终必然导致整个系统概念上的混乱和不一致。。。
带给用户的(语言的用户就是程序员)就是:较高概念复杂度,以及各种语言、语法陷阱。。。

java 从 5 开始已经不简洁,7出来,会是个什么样子呢?

8 楼 escape_2007 2010-04-16  
唉,真失败!
7 楼 faylai 2010-02-25  
如过多个方法要实现怎么写啊?
6 楼 faylai 2010-02-25  
真是乱七八糟
5 楼 H_eaven 2009-12-23  
改吧,全都改了.
4 楼 ixu 2009-12-02  
暴走的酱油瓶 写道
麻烦字大点

大不了,JavaEye的编辑器里不好搞啊,一调就全乱了
3 楼 1zebra 2009-11-27  
我还是不是很明白如何叫做。闭包。
2 楼 lovetysx 2009-11-27  
太丑了,呵呵
1 楼 暴走的酱油瓶 2009-11-26  
麻烦字大点

相关推荐

    基础深化和提高-java函数式编程

    Java函数式编程是指利用函数式编程的思想和特性来开发Java应用程序。函数式编程强调将计算过程视为数学函数的求值,侧重于函数的组合、映射、过滤等操作,同时避免了可变状态和可变数据。 在Java中,函数式编程主要...

    Scala—— 3.函数

    充分利用函数、只是函数的多种使用方式,在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在Java当中,函数的创建则要依赖于类...

    python基础2day05.txt

    函数是一等公民 函数本身可以赋值给变量,赋值后变量绑定函数 允许将函数本身作为参数传入另一个函数 允许返回一个函数 函数的可重入性: 可重入是指一个函数传的参数一定,则结果必须一定 要求: def定义的...

    Scala与Java的区别

    Scala函数式编程语言,在scala世界里,函数才是一等公民;函数可以作为参数进行传递,可以赋值给变量,可以作为返回值进行返回 Scala类型定义开头需大写 Scala函数定义需 def 开头,Scala函数没有返回值用Unit,相当...

    java修改源码-playscript-java:极客时间-《编译原理之美》playScript脚本语言相关代码,其已包含编译后的源码,可自行

    支持函数,并且函数是一等公民,可以嵌套声明函数,支持闭包。 支持面向对象特性。 构建和开发 从代码库中克隆下代码以后,可以基于源代码构建一个项目。 或者使用里面原来带的idea项目文件。 后面我将提供Maven的...

    霸屏天下源码java-CSS498-SM2017-FP:CSS498的独立研究

    学习核心函数式编程原则和技术,包括将函数用作一等公民、纯函数的重要性以及函数式语言中常见的高阶函数。 了解如何使用常见的不可变数据结构、不可变数据结构的算法以及这些算法的性能特征,包括它们如何与使用...

    java安卓仿微信聊天软件源码-GoodPhpDeveloper:努力成为一个优秀PHP开发

    与JAVA不同的是,PHP将函数视为"一等公民",如果你偏爱函数式编程的话,PHP也不会让你失望。以下是PHP5.3-PHP7.2中关于函数式的新特性: 闭包(PHP5.3) 闭包支持$this(PHP5.4) Closure::call() (PHP7.0) 异步编程 ...

    一道面试题引发的对javascript类型转换的思考

    最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: ...在 javascript 中,函数是一等公民,允许函数作为参数或者返回值传递。 得到了下面这个解法: function add() { var args =

    百度java贪吃蛇源码百度-JavaScriptAdvanced8:JavaScript高级联系新版

    百度java 贪吃蛇源码百度 --- 学习目标: - 理解面向对象开发思想 - 掌握 JavaScript ...中的一等公民 执行环境:在宿主环境(host environment)下运行,浏览器是最常见的 JavaScript 宿主环境 但是

    go-cheat-sheet:本文翻译自 https

    函数是一等公民 函数可以返回多值 有闭包 有指针,但没有指针的运算 内置的并发原语:协程和通道 基础语法 你好,世界 文件 hello.go: package main import "fmt" func main() { fmt.Println("He

    kotlin-video-tutorial:Kotlin视频教程

    一等公民函数基础语法 高阶函数、lambda表达式与匿名函数 面向对象知识点(类、接口、继承、扩展等) Kotlin语言中多样的class类型、对象以及枚举 强大的集合与控制流处理 操作符重载 更安全的泛型处理 代理模式及其...

    【卷一/共两卷】AJAX实战pdf高清版90M

    目录 第一部分 重新思考Web应用 ...B.3.1 函数是一等公民 B.3.2 向对象附加函数 B.3.3 从其他对象借用函数 B.3.4 Ajax事件处理和函数上下文 B3.5 JavaScript中的闭包 B.4 小结 B.5 资源 附录C Ajax框架和库

    c#源码转java源码的-flecs:适用于C和C++的快速实体组件系统(ECS)

    动态组合是ECS中的一等公民,数据与行为之间存在严格的隔离。 如果框架满足以下条件,则它就是实体组件系统: 具有作为唯一标识符的实体 具有纯数据类型的组件 具有根据组件的行为与实体匹配的系统 文献资料 如果您...

Global site tag (gtag.js) - Google Analytics