如果你是一个Java程序员,你认识“#”么?让我猜猜看,应该不太熟吧。因为在Java1.4.2时代,“#”仅仅用于在编写javadoc的注释内容,用于链接(@see)到对应类的具体方法。除此之外,在编写代码的时候,我们几乎不会用到它。
不过,别惊讶,在Java7发布之后,“#”或许将成为Java程序员最熟悉的朋友!因为在几天前,Sun的Java SE和OpenJDK的首席工程师Mark Reinhold,刚刚宣布Java7将加入一个简化版的“闭包”特性,其中的关键符号,就是“#”。也因为这个原因,Java7的正式发布时间,将从2010年2月份,推迟到9月份。
在Java7中,“#”将让函数方法,成为Java语言的一等公民。下面来看看如何用#语法实现“闭包”的吧:
简单的方法引用示例:
比如要引用String类的equals方法,应该这么写:
再看一个例子:
事件监听器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么?
分享到:
相关推荐
Java函数式编程是指利用函数式编程的思想和特性来开发Java应用程序。函数式编程强调将计算过程视为数学函数的求值,侧重于函数的组合、映射、过滤等操作,同时避免了可变状态和可变数据。 在Java中,函数式编程主要...
充分利用函数、只是函数的多种使用方式,在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在Java当中,函数的创建则要依赖于类...
函数是一等公民 函数本身可以赋值给变量,赋值后变量绑定函数 允许将函数本身作为参数传入另一个函数 允许返回一个函数 函数的可重入性: 可重入是指一个函数传的参数一定,则结果必须一定 要求: def定义的...
Scala函数式编程语言,在scala世界里,函数才是一等公民;函数可以作为参数进行传递,可以赋值给变量,可以作为返回值进行返回 Scala类型定义开头需大写 Scala函数定义需 def 开头,Scala函数没有返回值用Unit,相当...
支持函数,并且函数是一等公民,可以嵌套声明函数,支持闭包。 支持面向对象特性。 构建和开发 从代码库中克隆下代码以后,可以基于源代码构建一个项目。 或者使用里面原来带的idea项目文件。 后面我将提供Maven的...
学习核心函数式编程原则和技术,包括将函数用作一等公民、纯函数的重要性以及函数式语言中常见的高阶函数。 了解如何使用常见的不可变数据结构、不可变数据结构的算法以及这些算法的性能特征,包括它们如何与使用...
与JAVA不同的是,PHP将函数视为"一等公民",如果你偏爱函数式编程的话,PHP也不会让你失望。以下是PHP5.3-PHP7.2中关于函数式的新特性: 闭包(PHP5.3) 闭包支持$this(PHP5.4) Closure::call() (PHP7.0) 异步编程 ...
最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: ...在 javascript 中,函数是一等公民,允许函数作为参数或者返回值传递。 得到了下面这个解法: function add() { var args =
百度java 贪吃蛇源码百度 --- 学习目标: - 理解面向对象开发思想 - 掌握 JavaScript ...中的一等公民 执行环境:在宿主环境(host environment)下运行,浏览器是最常见的 JavaScript 宿主环境 但是
函数是一等公民 函数可以返回多值 有闭包 有指针,但没有指针的运算 内置的并发原语:协程和通道 基础语法 你好,世界 文件 hello.go: package main import "fmt" func main() { fmt.Println("He
一等公民函数基础语法 高阶函数、lambda表达式与匿名函数 面向对象知识点(类、接口、继承、扩展等) Kotlin语言中多样的class类型、对象以及枚举 强大的集合与控制流处理 操作符重载 更安全的泛型处理 代理模式及其...
目录 第一部分 重新思考Web应用 ...B.3.1 函数是一等公民 B.3.2 向对象附加函数 B.3.3 从其他对象借用函数 B.3.4 Ajax事件处理和函数上下文 B3.5 JavaScript中的闭包 B.4 小结 B.5 资源 附录C Ajax框架和库
动态组合是ECS中的一等公民,数据与行为之间存在严格的隔离。 如果框架满足以下条件,则它就是实体组件系统: 具有作为唯一标识符的实体 具有纯数据类型的组件 具有根据组件的行为与实体匹配的系统 文献资料 如果您...