Java加上Xtend,满足你对C#语法的所有想象
来源:互联网 发布:人工智能性爱娃娃 编辑:程序博客网 时间:2024/05/17 23:24
好吧,标题言过其实了,Xtend只是在某些方面提供了与C#类似的语法。又或者作为资深Java程序猿,你根本就对这个标题感到愤怒或不屑,“我大Java何时要与屌丝C#做比较了”。但无论如何,Xtend在语法上的清爽还是让我这个非资深程序猿感到了惊喜。如果你偶尔也对Java重复的getter/setter感到无聊,对Java5/6/7缺少Lambda表达式感到遗憾,那么,Xtend刚好可以解决你的问题。
Xtend是啥
Xtend是eclipse旗下的开源项目,主页是http://www.eclipse.org/xtend/。简单的说,它是为Java语言添加的Syntax Sugar。只要向你的eclipse添加Xtend插件(如何安装见Xtend主页),然后在Java工程中建立.xtend文件,你就可以写Xtend代码了。编译时,Xtend会首先被预处理为Java代码,在eclipse中你可以实时看到预处理的结果。见下图:
这样你大概清楚了,Xtend与Java一定是100%兼容的。实际情况确实如此,你可以向任意Java工程中加入任意数量的xtend文件,它们可以与所有的Java代码相互调用。这是因为,不管是对于Javac还是JVM,它们都是一种东西。
既然如此,我就会想,如果Xtend能给项目开发带来一点好处的话,那为什么不用呢,毕竟我不会因此损失任何东西。但是,Xtend带来的不是一点好处,而是大大的好处。
Xtend能给我们带来啥
简单来说,Xtend能使我们的项目代码更加干净,就算从耄耋老人变成小清新也不是不可能。下面举例说明一些Xtend的主要特性。
类型推导
//自动推导出strList的类型
var strList =new ArrayList<String>
//自动推断出item的类型
for (item : strList) {
}
扩展方法
importstaticextension java.util.Collections.*
…
// 相当于调用Collections.singletonList(new MyClass())
new MyClass().singletonList();
属性读写
if(p.firstName =="XX"){//相当于调用p.getFirstName()方法
p.firstName = "YY"// 相当于调用p.setFirstName("YY")方法
}
Lambda表达式
val textField = new JTextField
//用lambda表达式注册一个回调函数
textField.addActionListener(
[ ActionEvent e |
textField.text = "Something happened!"
])
//以下代码非常像C#中的Linq
valresult = personList
.filter[firstname.startsWith("J")]//根据firstname属性过滤
.sortBy[age]//根据age属性排序
.take(3)//取前三个
.map[surname +", " + firstname]//组合出完整的名字
.join("; ")//构造一个以"; "为分隔符的字符串
:.和?:操作符
//以下等价于if(myRef != null) myRef.doStuff()
myRef?.doStuff
//以下等价于
// if(person.firstName != null) salutation = person.firstName;
// else salutation = "Sir / Madam";
val salutation = person.firstName ?:'Sir / Madam'
增强的switch
switch myString {
case myString.length >5:"a long string."//根据case中boolean表达式的值判断
case'some' : "It’s some string."//调用equals方法判断
default : "It’s another short string."
}
…
switch x {
String : x.length//如果x是string类型,则调用((String)x).length()
List<?> : x.size // 如果x是List<?>类型,则调用((List<?>)x).size()
default : -1
}
其它
另外还有其他特性,简单列出(不是完整列表)。
1. 内置模板表达式(类似于Velocity/FreeMarker的功能)
2. Collection/Map的常量表达式
3. Typeof关键字
4. as关键字
结语
几年前我第一次用Xtext解析Domain Specific Language(DSL)时,就接触到了Xtend,因为Xtext强烈推荐用Xtend实现DSL的解析。但当时认为为此学习一种奇怪的语法非常不值,因此回避了Xtend部分。今年再次用到Xtext,感觉总要比上次有些长进吧,就细细钻研了下Xtend的语法,最后边看边爽,“哈哈,这正是我想要的”。
在语法的很多方面,C#有比Java更强大的feature。比如C#很早就有Lambda表达式,而Java从Java 8才开始支持。但是Xtend可以在一定程度上弥补Java语法的不足,尤其是对Collection进行大量统计操作的时候,Xtend的Lambda表达式,再加上map/reduce/filter等Extension方法,一定是你需要的武器。
最后,Xtend非常简单,它的Reference Documentation总共不过60多页。那么赶紧去看看吧,网址是http://www.eclipse.org/xtend/documentation.html
- Java加上Xtend,满足你对C#语法的所有想象
- Eclipse Xtend对Java说:我帮你瘦身
- 【JAVA秒会技术之Joda-Time】满足你所有关于日期的处理
- 小话设计模式(零)设计模式可以满足你对编程的所有幻想(误)
- 9个网站满足你所有研究的需要
- 想象五年后的你
- 想象五年后的你
- 想象5年后的你
- 想象5年后的你
- 想象5年后的你
- 想象5年后的你
- 想象5年后的你
- c#初级篇-给所有的单词加上双引号
- 出乎你的想象:window.open与location.replace对asp.net頁面的影响
- 想象5年后的你-----写给对程序迷茫的人
- 稻盛和夫:不要以你现在的能力,束缚对未来的想象
- Eclipse Xtend - 疯狂的Java10
- 自认为对C#语法了如指掌的你,来试试这些题目吧
- POJ1005
- CCLayer中Touch事件(Standard Touch Delegate和Targeted Touch Delegate)
- HTML浏览器对象的结构
- forTest
- 9.5 不要轻视拷贝构造函数与赋值函数
- Java加上Xtend,满足你对C#语法的所有想象
- 自己动手做个智能小车(1)
- list_entry
- TOJ 1609 Moo University - Team Tryouts
- Non recursive Depth first search
- iOS block教程
- 【剑指offer】快速排序
- 【Cocoa and Object-c : Up and Running 笔记】07 C语言内存模型
- 自己动手写操作系统——PC Bootstraps