Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 683|回复: 0

学习Java闭包的使用

[复制链接]

该用户从未签到

发表于 2011-9-13 21:39:41 | 显示全部楼层 |阅读模式
如果你是一个java程序员,你认识“#”么?让我猜猜看,应该不太熟吧。因为在Java1.4.2时代,“#”仅仅用于在编写javadoc的注释内容,用于链接(@see)到对应类的具体方法。除此之外,在编写代码的时候,我们几乎不会用到它。
不过,别惊讶,在Java 7发布之后,“#”或许将成为Java程序员最熟悉的朋友!因为在几天前(51CTO编辑注:本文翻译于09年11月底,当时Sun刚刚公布说Java 7将包含简单的闭包),Sun的Java SE和OpenJDK的首席工程师Mark Reinhold,刚刚宣布Java 7将加入一个简化版的“闭包”特性,其中的关键符号,就是“#”。也因为这个原因,Java 7的正式发布时间,将从2010年2月份,推迟到9月份。
在Java 7中,“#”将让函数方法,成为Java语言的一等公民。下面来看看如何用#语法实现“闭包”的吧:
简单的方法引用示例:
比如要引用String类的equals方法,应该这么写:
[pre]
    String#equals(Object)  [/li]
[/pre]再看一个例子:
[pre]
    java.io.File#exists()   [/li]
[/pre]事件监听器1 (代码示例,来自Cay Horstmann)
使用闭包前:
[pre]
    button.addActionListener(   [li]new ActionListener() {   public void actionPerformed(ActionEvent ){  [li]System.out.println("Hi!"); }    }   [li]);   [/li]
[/pre]使用闭包后 :
[pre]
    button.addActionListener(#(ActionEvent e) System.out.println("Hi!));  [li] [/li]
[/pre]事件监听器2(代码示例,来自FSM )
使用闭包前:
[pre]
    public void init() {  [li]JButton button = ...;  button.addActionListener(new ActionListener() {  [li] public void actionPerformed(ActionEvent ev) {   handleAction(ev);  [li] }  });  [li]}  public void handleAction(ActionEvent ev) {  [li]// handle event  }  [li] [/li]
[/pre]使用闭包后:
[pre]
    public void init() {  [li]JButton button = ...;  button.addActionListener(this#handleAction(ActionEvent));  [li]}  public void handleAction(ActionEvent ev) {  [li]// handle event  }  [li] [/li]
[/pre]排序比较器(代码示例,来自FSM 、Cay Horstmann)
使用闭包前:
[pre]
    List<String> list = ...  [li]Collections.sort(list, new Comparator<String>() {  public int compare(String str1, String str2) {  [li] return str1.length() - str2.length();  }  [li]});   [/li]
[/pre]使用闭包后:
[pre]
    List<String> list = ...  [li]Collections.sort(list, #(String str1, String str2) {  return str1.length() - str2.length();  [li]});   [/li]
[/pre]甚至或简化成:
[pre]
    Collections.sort(strings,   [li]#(String a, String b) a.length() - b.length());    [/li]
[/pre]最后,我们复习一下javadoc中的#的用法:
引用当前类的成员字段、方法、构造器
[pre]
    @see#field  [li] @see#method(Type, Type,...)  [li] @see#method(Type argname, Type argname,...)  [li] @see#constructor(Type, Type,...)  [li] @see#constructor(Type argname, Type argname,...)  [li] [/li]
[/pre]引用已经导入的类的成员字段、方法、构造器,或嵌套类
[pre]
    @seeClass#field  [li] @seeClass#method(Type, Type,...)  [li] @seeClass#method(Type argname, Type argname,...)  [li] @seeClass#constructor(Type, Type,...)  [li] @seeClass#constructor(Type argname, Type argname,...)  [li] @seeClass.NestedClass  [li] @seeClass [li] [/li]
[/pre]引用其他包里的类成员
[pre]
    @seepackage.Class#field  [li] @seepackage.Class#method(Type, Type,...)  [li] @seepackage.Class#method(Type argname, Type argname,...)  [li] @seepackage.Class#constructor(Type, Type,...)  [li] @seepackage.Class#constructor(Type argname, Type argname,...)  [li] @seepackage.Class.NestedClass  [li] @seepackage.Class  [li] @seepackage   [li] [/li]
[/pre]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-7 01:44 , Processed in 0.371849 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表