您好 ,我是湘王 ,这是我的博客园 ,欢迎您来 ,欢迎您再来~
自从Java在2009年被Oracle收购之后 ,就不再开源 ,除了Oracle官方发布的版本之外 ,还有OpenJDK版本 ,这两者的区别可以自行找某度去搞明白 。对于没有几千万用户的应用来说 ,OpenJDK已经足够了 ,即使是一些大厂 ,内部系统用OpenJDK也足够了 。
从Java 8开始 ,整个JDK就一直在致力于不断改进,不断融合新的开发特性 。Java目前始终保持前向兼容 ,所以如果有新的稳定版JDK出来 ,就可以立即使用新的JDK,尝试一些新特性 ,而不必担心不兼容的问题(可能个别地方有改动 ,但对个人及小型开发来说可以忽略不计) 。
先做一些名词解释:
1 、JEP:Java Enhancement Proposals ,Java增强提案 。
2 、JSR:Java Specification Requests的缩写 ,意思是Java规范提案 ,是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求 。
3 、CSR:是Compatibility & Specification Review的缩写 ,也就是兼容性和特征检视 。
4 、?标记:是那些未在官方JEP中列出 ,但明确在该版本Java API中具有 ,而前一版本API没有的特性 。
先来看看Java9增加一些特性:
Java9主要的改进包括模块系统(261) 、JShell(222) 、日志集成(264) 、弃用GC组合(214) 、统一JVM日志(158) 、统一GC日志(271) 、集合工厂方法(269) 、G1作为默认GC(248) 、废弃CMS GC(291)、Http 2 Client(110) 、私有接口方法(?) 、StreamAPI(?)、FlowAPI(?)等 。
其中 ,模块系统 、JShell完全是鸡肋 ,可以忽略;
日志集成基本上也不会用Java自带的 ,跳过;
关于GC的后面会说 ,这里跳过;
Http 2 Client在后续Java10及更高版本中又有改进,Java9中的语法基本被废弃 ,所以可以先不看;
FlowAPI其实也是鸡肋 ,在外部MQ如此强大的情况下,没有人会用Java自带的Pub-Sub 。
所以总结说起来 ,Java9真正比较有用的就是集合工厂方法 、私有接口方法和StreamAPI了 。
在Java9以前创建集合的时候 ,是这么干的:
而Java9就开始偷懒了:
/**
* 新的集合工厂方法
*/
Set<String> set2 = Set.of("A", "B", "C");
System.out.println(set2);
List<String> list2 = List.of("A", "B", "C");
System.out.println(list2);
Map<String, String> map2 = Map.of("A", "Apple", "B", "Boy", "C", "Cat");
System.out.println(map2);
Map<String, String> map3 = Map.ofEntries(
new AbstractMap.SimpleEntry<>("A", "Apple"),
new AbstractMap.SimpleEntry<>("B", "Boy"),
new AbstractMap.SimpleEntry<>("C", "Cat"));
System.out.println(map3);
Java8一个接口中能定义如下几种变量/方法:
1 、常量
2 、抽象方法
3 、默认方法
4 、静态方法
Java9又增加了两种:
1 、私有方法
2 、私有静态方法
可以敲代码试试看:
/**
* Java9的新接口方法
*
* @author 湘王
*/
public interface NewInterface {
// 私有方法
private void method1() {
System.out.println("from private method");
}
// 私有静态方法
private static void method2() {
System.out.println("from private static method2");
}
default void general() {
method1();
method2();
}
}
基于Java8的流式编程 ,Java9又增加了几个方法:takeWhile 、dropWhile 、iterate和ofNullable 。来看看代码:
// Stream API
// 遇见空值停止输出
Stream.of("a","b","c","","e","f").takeWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 遇见空值才开始输出
Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
.forEach(System.out::println);
// 函数式迭代 ,使用初始种子值创建顺序(可能是无限)流
IntStream.iterate(3, x -> x < 10, x -> x + 3)
.forEach(System.out::println);
// 预防NullPointerExceptions异常 , 可以通过检查流来避免null值
long count = Stream.ofNullable(null).count();
System.out.println(count);
相比较于Java 9 ,Java10的特性少了很多:
比较有意思的就是增加了一个叫做var的关键字(向Javascript学习吗?Java也想长个script的尾巴?)
// var关键字
// 不建议这样 ,非常不安全
var set = Set.of("A", 1, "C");
System.out.println(set);
var list = List.of("A", 2, "C");
System.out.println(list);
var map = Map.of("A", 1, "B", "Boy", "C", "Cat");
System.out.println(map);
for (var s : list) {
System.out.println(s);
}
// 应该这样使用
var list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
list2.add("3");
// 属性字段不能用var
private var list = new ArrayList<String>();
// 方法参数不能用var
public void test(var list) {
System.out.println("123");
}
虽然多了var这个关键字 ,但我想真正习惯这种用法的人毕竟还是少数吧。而且对于大多数码农来说 ,如果在接手的系统中看到这种「新式」代码 ,可能会有点懵 。至于其他新增的特性 ,基本都是鸡肋 。
感谢您的大驾光临!咨询技术 、产品 、运营和管理相关问题 ,请关注后留言。欢迎骚扰,不胜荣幸~
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织,在未征得本站同意时 ,禁止复制、盗用 、采集 、发布本站内容到任何网站、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。