代码改变世界

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