Java中有哪些语法糖?
2019-01-01 17:27 GarfieldEr007 阅读(462) 评论(0) 编辑 收藏 举报
不要你写汇编,Java句句是糖
不能同意上面的这句话,要说为什么,首先要定义下面要讲的“语法糖”。
语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,并没有给语言添加什么新东西,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
语法糖_百度百科
从上面可以看出,就Java语言而言,语法糖并没有给class级别的代码新增其他特性,而是借助编译器,实现了基于编译器的新语法。这种新语法方便易用,可读性好易维护,所以称之为“糖”。下面谈到的都是基于编译器的语法糖。
1. 自动装箱与拆箱(Autoboxing and unboxing)(JDK 1.5)
代码
Integer amount = 100;
编译后,就自动装箱为
Integer amount = Integer.valueOf(100);
同样的,自动拆箱
Integer amount = ...;
int x = amount; // 实际为: int x = amount.intValue();
可以看出,自动拆箱是有可能抛出NullPointerException的,要留意避免。
2. 泛型与类型擦除(JDK 1.5)
从JDK 1.5开始,Java引入了泛型,但Java的泛型是通过类型擦除实现的(当然有很多人吐槽这不是真正的泛型),即只在源代码中有泛型定义,到了class级别就被擦除了(类的成员变量的泛型可以通过反射获取到)。
Map<String,String> map = new HashMap<String,String>();
map.put("hello world","你好啊,李银河");
String hello = map.get("hello");
System.out.println(hello);
// 编译后,反省被擦除,并引入强制类型转换
Map map = new HashMap(); //类型擦除
map.put("hello", "你好啊,李银河");
String hello = (String)map.get("hello");//强制转换
System.out.println(hello);
3. 方法变长参数(JDK 1.5)
public static void print(String... args) {
for(String str : args){
System.out.println(str);
}
}
// 编译后
public static void print(String... args) {
String[] var1 = args;
int var2 = args.length;
//增强for循环的数组实现方式
for(int var3 = 0; var3 < var2; ++var3) {
String str = var1[var3];
System.out.println(str);
}
}
4. 接口Iterable支持的foreach语法(JDK 1.5)
很常见,不赘述
5. 枚举类型
6. 接口AutoCloseable支持的try-with-resource语法(JDK 1.7)
7. switch支持枚举、字符串
其他:
JDK1.8 待熟悉了Lambda的本质之后再决定补充与否。
作者:陈鹏
链接:https://www.zhihu.com/question/26971230/answer/268464546