java8https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

1)、lamda

2)、函数式接口

@FunctionalInterface
interface Operation {
    int operation(int a, int b);
}
class Test {
    private int operate(int a, int b, Operation operation) {
        return operation.operation(a, b);
    }
}

Test test = new Test();

*****java8前:
test.operate(1, 2, new Operation() {
    @Override
    public int operation(int a, int b) {
        return a + b;
    }
});
*****java8:
test.operate(1, 2, (a, b) -> a + b);

3)、接口默认方法和静态方法

Java 8 新增了接口的默认实现,通过 default 关键字表示。同时也可以提供静态默认方法。

public interface TestInterface {
    String test();

    // 接口默认方法
    default String defaultTest() {
        return "default";
    }

    static String staticTest() {
        return "static";
    }
}

4)、Optional

Java 8 中新增了 Optional 类用来解决空指针异常。Optional 是一个可以保存 null 的容器对象。通过 isPresent() 方法检测值是否存在,通过 get() 方法返回对象。

// 创建一个 String 类型的容器
Optional<String> str = Optional.of("str");
// 值是否存在
boolean pre = str.isPresent();
// 值如果存在就调用 println 方法,这里传入的是 println 的方法引用
str.ifPresent(System.out::println);
// 获取值
String res = str.get();
// 传入空值
str = Optional.ofNullable(null);
// 如果值存在,返回值,否则返回传入的参数
res = str.orElse("aa");
str = Optional.of("str");
// 如果有值,对其调用映射函数得到返回值,对返回值进行 Optional 包装并返回
res = str.map(s -> "aa" + s).get();
// 返回一个带有映射函数的 Optional 对象
res = str.flatMap(s -> Optional.of(s + "bb")).flatMap(s -> Optional.of(s + "cc")).get();

5)、Base64支持

String base64 = Base64.getEncoder().encodeToString("aaa".getBytes());
System.out.println(base64);
byte[] bytes = Base64.getDecoder().decode(base64);
System.out.println(new String(bytes));

6)、对并发的增强 在java.util.concurrent.atomic包中还增加了下面这些类

DoubleAccumulator DoubleAdder LongAccumulator LongAdder

java9https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6

1)、Jigsaw 模块系统
2)、JShell REPL。直接在控制台上录入java代码并执行,无需编译。
3)、接口中可使用私有方法

public interface TestInterface {
    String test();

    // 接口默认方法
    default String defaultTest() {
        pmethod();
        return "default";
    }

    private String pmethod() {
        System.out.println("private method in interface");
        return "private";
    }
}

4)、创建不可变集合

之前:
public interface TestInterface {
    String test();

    // 接口默认方法
    default String defaultTest() {
        pmethod();
        return "default";
    }

    private String pmethod() {
        System.out.println("private method in interface");
        return "private";
    }
}

java9:
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
Map<String, String> map = Map.of("KA", "VA", "KB", "VB");

5)、多版本兼容 jar 包

Java 9 中支持在同一个 JAR 中维护不同版本的 Java 类和资源。

6)、新增HTTP2 Client

public class HttpTest {
    public static void main(String[] args) throws Exception {
        String uri = "http://www.oracle.com/";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(uri))
                .build();

        HttpResponse<String> response =
                client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}

java10https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html#NewFeature

1)、var局部变量类型推断,如:

之前:ArrayList<String> myList = new ArrayList<String>()
现在:var list = new ArrayList<String>()

2)、JDK 10 引入一种在线程上执行回调的新方法,很方便的停止单个线程而不是停止全部线程或者一个都不停。

java11https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#NewFeature

1)、支持TLS1.3

2)、java 命令直接编译并运行 java 文件,省去先 javac 编译生成 class 再运行的步骤
3)、字符串API增强

// 判断字符串是否为空白
" ".isBlank();
" Javastack ".stripTrailing();  // " Javastack"
" Javastack ".stripLeading();   // "Javastack "

4)、Lambda 表达式中使用 var。如:(var x, var y) -> x.process(y)

java12https://www.oracle.com/technetwork/java/javase/12all-relnotes-5211423.html#NewFeature

1)、unicode支持:中国象棋符号、评级半星、表情符号
2)、NumberFormat。如:

NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
String result = fmt.format(1000);

上面的示例生成“ 1K”。

3)、G1和Parallel GC中的这一实验性功能允许他们在替代存储设备(例如NV-DIMM内存)上分配旧版Java堆。
4)、switch,如

private String switchTest(int i) {
    return switch (i) {
        case 1 -> "1";
        default -> "0";
    };
}

java13https://www.oracle.com/technetwork/java/13-relnote-issues-5460548.html#NewFeature

01-04 02:55