Java加上Xtend,满足你对C#语法的所有想象

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiangfuqiang/article/details/26169813

好吧,标题言过其实了,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."//根据caseboolean表达式的值判断

           case'some' : "It’s some string."//调用equals方法判断

           default : "It’s another short string."

       }

       switch x {

           String :  x.length// 如果xstring类型,则调用((String)x).length()       

           List<?> :   x.size // 如果xList<?>类型,则调用((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的奇怪想象

03-02

我的程序如下: rnpackage hj.com; rnrnimport org.eclipse.swt.SWT; rnimport org.eclipse.swt.events.KeyAdapter; rnimport org.eclipse.swt.events.KeyEvent; rnimport org.eclipse.swt.events.KeyListener; rnimport org.eclipse.swt.widgets.Display; rnimport org.eclipse.swt.widgets.List; rnimport org.eclipse.swt.widgets.Shell; rnrnpublic class testList rnrnprotected Shell shell; rnrn/** rn * Launch the application rn * @param args rn */ rnpublic static void main(String[] args) rntry rntestList window = new testList(); rnwindow.open(); rn catch (Exception e) rne.printStackTrace(); rn rn rnrn/** rn * Open the window rn */ rnpublic void open() rnfinal Display display = Display.getDefault(); rncreateContents(); rnshell.open(); rnshell.layout(); rnwhile (!shell.isDisposed()) rnif (!display.readAndDispatch()) rndisplay.sleep(); rn rn rnrn/** rn * Create contents of the window rn */ rnprotected void createContents() rnshell = new Shell(); rnshell.setSize(500, 375); rnshell.setText("SWT Application"); rnrnfinal List list=new List(shell,SWT.BORDER); rn// list.select(0); rnlist.setItems(new String[]"第0","第1","第2","第3","第4"); rnlist.setBounds(0,0,50,200); rnlist.setSelection(0); rnrnlist.addKeyListener(new KeyAdapter() rn public void keyPressed(KeyEvent e) rn int curIndex=list.getSelectionIndex(); rn int total=list.getItemCount(); rn rn if(e.keyCode==SWT.ARROW_UP) rn if(curIndex==0) rn list.select(total-1); rn int c=list.getSelectionIndex(); rn System.out.println(c); rn rn else if(e.keyCode==SWT.ARROW_DOWN) rn if(curIndex==total-1) rn list.select(0); rn int c=list.getSelectionIndex(); rn System.out.println(c); rn rn rn rnrnrnrn); rnrn// rn rnrn rn我的功能是当按光标向下时,LISH中被选中的item依次下移,但是当移到最后一项时,则重新选择第一项。但上述程序当移动到最后一项,却选择第二项而不是第一项,这是为什么呢?? 论坛

没有更多推荐了,返回首页