java8:https://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
java9:https://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()); } }
java10:https://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 引入一种在线程上执行回调的新方法,很方便的停止单个线程而不是停止全部线程或者一个都不停。
java11:https://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)
java12:https://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"; }; }
java13:https://www.oracle.com/technetwork/java/13-relnote-issues-5460548.html#NewFeature