稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

Java 7和8的新特性以及与Android开发的关系

Oracle一直在推动Java的发展,到目前最新的Java SE是Java 8以及JDK8,但是目前貌似很多人还在使用Java 6(JDK6),于是就花时间小研究了下Java 7与Java 8。

Java 7(JDK 7)的语言新特性

Java SE 7新增的语言特性并不是很多,主要有:

  • try 语句资源管理(The try-with-resources Statement)
  • 同一catch捕获多个异常(Catching Multiple Exception Types)
  • 创建泛型对象时的类型推测(Type inferenes for Generic Instance Creation)
  • 二进制的字面常量(Binary Literals)
  • 数值字面常量里的可以有下划线(Underscores in Numeric Literals)
  • switch语句支持String(Strings in switch Statements)

下面来个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;
import java.net.*;
import java.util.*;

public class Switch {
    // Underscores in numeric literals
    public static int USER_COUNT_LIMIT = 1_000_000_000;
    public static void main(String[] args) {
        // Type inference when creating generics
        List<String> fruits = new ArrayList<>(args.length);
        for (String a : args) {
            fruits.add(a);
        }
        // Strings in switch
        for (String a : fruits) {
            switch (a) {
            case "apple":
                System.out.println("eat an apple a day, the doctors go away");
                break;
            case "orange":
                System.out.println("orange juice");
                break;
            default:
                System.out.println("i do not know what you want");
                break;
            }
        }

        // With 'try-with-resources' no longer need finally to clean up resources.
        try (BufferedReader br = new BufferedReader(new FileReader(args[args.length - 1]))) {
            System.out.println(br.readLine());
            Thread.sleep(1000);
        // Catch multiple exceptions
        } catch (InterruptedException | IOException e) {
            System.out.print(e.getMessage());
        }

        // binary literals
        int userCount = 0b1010101;
        System.out.println("Current we have " + userCount + " users, while limit is " + USER_COUNT_LIMIT);
        if (userCount < USER_COUNT_LIMIT) {
            System.out.println("We are okay, it is under control");
        } else {
            System.out.println("Alert alert alert");
        }
    }
}

编译并运行:

1
2
3
4
5
6
7
8
[alex:jdk1.7.0_71]$./bin/javac Switch.java -Xlint
[alex:jdk1.7.0_71]$./bin/java Switch apple Switch.java README.html
eat an apple a day, the doctors go away
i do not know what you want
i do not know what you want
<html>
Current we have 85 users, while limit is 1000000000
We are okay, it is under control

可以看出,其实Java 7并无太大改进,只是多了些语法糖而已。

Java 8(JDK 8)的语言新特性

Java 8最大的改进就是增加了lambda表达式(Lambda Expression),来看个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;

public class Lambda<T> {
    public void apply(List<T> list, Action<T> action) {
        for (T t : list) {
            action.perform(t);
        }
    }

    public static void main(String[] args) {
        List<String> stuff = new ArrayList<>();
        for (String s : args) {
            stuff.add(s);
        }

        Lambda<String> lambda = new Lambda<>();
        // Use lambda expression to specify action
        lambda.apply(stuff, s -> System.out.println(s));

        // Another example of lambda expression for threading
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("working " + i + " seconds");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {}
            }
        }).start();
    }
}

interface Action<T> {
    public void perform(T t);
}

编译并运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[alex:jdk1.8.0_25]$./bin/javac Lambda.java -Xlint
[alex:jdk1.8.0_25]$./bin/java Lambda apple orange
apple
orange
working 0 seconds
working 1 seconds
working 2 seconds
working 3 seconds
working 4 seconds
working 5 seconds
working 6 seconds
working 7 seconds
working 8 seconds
working 9 seconds

在Java 8中,可以比用匿名内部类更加方便的方式来设置回调。

Android中的Java

那么,Android到底与Java是什么关系呢?有人说它们是一样的。其实没啥关系,Android虽然使用Java语言作为它的主要开发语言,但是它并完全等同于Java SE JDK,JDK中关于UI的AWT和Swing在Android都没有,所以它的API是标准JDK 6的一个子集。Android中的Java是基于ApacheApache Harmony,与标准Java SE 6语法完全一样,可以看看它们之间的异同,以及Dalvik与Java VM

Java 7和Java 8与Andoid开发

Java在进步,语法上越来越人性化,那么Android开发能否得益呢?Java 7是可以的,在最新的开发工具(ADT 23和Kitkat)下,可以使用Java 7。但对于Java 8不能直接使用,只能借助第三方工具来翻译bytecode。所以对于Android开发者同学们来说,尝一尝Java最新的语法糖就可以了,想要天天使用,还要慎重考虑哦!

参考

Comments