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

好吧,标题言过其实了,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#语法的所有想象

时间: 2024-11-10 13:27:42

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

Java核心基础(1) 基本语法

Java基本语法 面试题总结(1) 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制 ??可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一 致. 2.Java 中有没有 goto? ??有,但是是作为保留字使用,现在没有在Java中使用. 3.八种基本数据类型和包装类以及大小. 八种基本数据类型 包装类 大小 byte Byte 8位 -2^7 ~ 2^7-1 short Short 16位 -2^15 ~ 2^15-

Java Script基础(二) 基本语法

一.变量的声明和使用 JavaScript是一种弱类型的语言,没有明确的数据类型,在声明变量时,不需要指定变量的类型,变量的类型由赋给变量的值决定. 变量声明的语法: var 变量名; 示例: var num; //直接声明一个变量,不赋值 var num = 10 //声明变量并赋值,类型由赋值的值决定. 注意: 1.JavaScript区分大小写,特别是变量的命名.语句关键字等. 2.变量可以不经声明而直接使用:例如:num=20,但这种方法很容易出错,也很难查找排错,所以不推荐使用. 二.

Java Web学习(7):JSP基础语法

一个JSP页面可以被分为以下几部份: 1)静态数据,如HTML: 2)JSP指令,如include指令: 3)JSP脚本元素和变量: 4)JSP动作: 5)用户自定义标签: 一静态数据 静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致.此时,该JSP输入文件会是一个没有内嵌 Java或动作的HTML页面.而且,客户端每次请求都会得到相同的响应内容. 这个静态数据的本质就是HTML文档. 二JSP指令 JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令: (1)pag

java的继承、接口方面的语法及知识

继承(inheritance):一个类只能继承一个类代码复用继承的语法:class ChildClass extends ParentsClass{ }父类的属性子类中都存在,只是有没有权限访问的问题根据名字找谁是谁?1.变量-> 类型 (类.接口)->接口2.已经确定是变量局部变量.形参->类的属性-> 外部类的属性就近原则构造方法:注意默认的那个无参构造方法 优先调用父类的构造方法如果没有明确指出,java会插入一条调用父类的构造方法(无参的)利用super关键字:1.调用父类

一脚踩进java之中级篇01——xml基础语法

一.XML简介 1.1 什么是XML? 1)XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是传输数据,而非显示数据. 2)XML标签没有被预定义,需要用户自行定义标签. 3)XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范. 4)XML被广泛认为是继Java之后在Internet上最激动人心的新技术. 1.2 X

java学习笔记(二)基础语法(上)

Java 作为一门编程语言,与其它语言一样,有字符集,标识符和关键字,变量,常量,语句等编程语言的基本要素. 关键字:abstract抽象的,boolean布尔型,break跳出循环,continue中止本次循环,byte字节型,case,catch,char,class,const,default,do,double,else,extends,assert,final,finally,float ,for,if,implements,import,instandceof,int,interfa

Java千百问_03基本的语法(005)_二进制是如何做位运算的

点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种的运算符都有哪些 大部分运算流程都是先将整数转换为二进制.然后进行对应二进制操作.常见的操作有例如以下几种:以下我们具体说明,运算符的优先级看这里:java运算符的优先级是如何的 1.按位与 and两个二进制数进行按位与操作:同样位的两个数字都为1.则为1:若有一个不为1,则为0. 比如:00101

java语法糖

语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(assert)等 断言(as

c#语法与java语法的对比分析

早期开发的时候一直用c/c++,后来主要用的是java.最近需要用下c#. 熟悉了下c#,发现c#语言在对c/c++基础上做了很多简化,同时参考了很多java的语法习惯,本来在语法上c/c++就有很多和java类似的地方,现在c#就类似的地方更多了,不过还是有很多区别. 本文总结下c# 和 java的语法差别,便于相互学习,加强理解. 一.基本语法的对比 1.程序框架 同java一样,c#要求所有的代码都要在类中,不再同c++一样,既可以定义类,也可以定义全局的方法. java程序的入口代码必须