• Java新特性(1):Java 9和Java10


    您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

    自从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)、私有接口方法(?)、Stream API(?)、Flow API(?)等。

    其中,模块系统、JShell完全是鸡肋,可以忽略;

    日志集成基本上也不会用Java自带的,跳过;

    关于GC的后面会说,这里跳过;

    Http 2 Client在后续Java10及更高版本中又有改进,Java9中的语法基本被废弃,所以可以先不看;

    Flow API其实也是鸡肋,在外部MQ如此强大的情况下,没有人会用Java自带的Pub-Sub。

    所以总结说起来,Java9真正比较有用的就是集合工厂方法、私有接口方法和Stream API了。

    在Java9以前创建集合的时候,是这么干的:

    1. /**
    2. * 以前的集合创建方法
    3. */
    4. Set set = new HashSet<>();
    5. set.add("A");
    6. set.add("B");
    7. set.add("C");
    8. set = Collections.unmodifiableSet(set);
    9. System.out.println(set);
    10. List list = new ArrayList<>();
    11. list.add("A");
    12. list.add("B");
    13. list.add("C");
    14. list = Collections.unmodifiableList(list);
    15. System.out.println(list);
    16. Map map = new HashMap<>();
    17. map.put("A", "Apple");
    18. map.put("B", "Boy");
    19. map.put("C", "Cat");
    20. map = Collections.unmodifiableMap(map);
    21. System.out.println(map);

    而Java9就开始偷懒了:

    1. /**
    2. * 新的集合工厂方法
    3. */
    4. Set set2 = Set.of("A", "B", "C");
    5. System.out.println(set2);
    6. List list2 = List.of("A", "B", "C");
    7. System.out.println(list2);
    8. Map map2 = Map.of("A", "Apple", "B", "Boy", "C", "Cat");
    9. System.out.println(map2);
    10. Map map3 = Map.ofEntries(
    11. new AbstractMap.SimpleEntry<>("A", "Apple"),
    12. new AbstractMap.SimpleEntry<>("B", "Boy"),
    13. new AbstractMap.SimpleEntry<>("C", "Cat"));
    14. System.out.println(map3);

    Java8一个接口中能定义如下几种变量/方法:

    1、常量

    2、抽象方法

    3、默认方法

    4、静态方法

    Java9又增加了两种:

    1、私有方法

    2、私有静态方法

    可以敲代码试试看:

    1. /**
    2. * Java9的新接口方法
    3. *
    4. * @author 湘王
    5. */
    6. public interface NewInterface {
    7. // 私有方法
    8. private void method1() {
    9. System.out.println("from private method");
    10. }
    11. // 私有静态方法
    12. private static void method2() {
    13. System.out.println("from private static method2");
    14. }
    15. default void general() {
    16. method1();
    17. method2();
    18. }
    19. }

    基于Java8的流式编程,Java9又增加了几个方法:takeWhile、dropWhile、iterate和ofNullable。来看看代码:

    1. // Stream API
    2. // 遇见空值停止输出
    3. Stream.of("a","b","c","","e","f").takeWhile(s-> !s.isEmpty())
    4. .forEach(System.out::println);
    5. // 遇见空值才开始输出
    6. Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
    7. .forEach(System.out::println);
    8. // 函数式迭代,使用初始种子值创建顺序(可能是无限)流
    9. IntStream.iterate(3, x -> x < 10, x -> x + 3)
    10. .forEach(System.out::println);
    11. // 预防NullPointerExceptions异常, 可以通过检查流来避免null值
    12. long count = Stream.ofNullable(null).count();
    13. System.out.println(count);

    相比较于Java 9,Java10的特性少了很多:

     

    比较有意思的就是增加了一个叫做var的关键字(向Javascript学习吗?Java也想长个script的尾巴?)

    1. // var关键字
    2. // 不建议这样,非常不安全
    3. var set = Set.of("A", 1, "C");
    4. System.out.println(set);
    5. var list = List.of("A", 2, "C");
    6. System.out.println(list);
    7. var map = Map.of("A", 1, "B", "Boy", "C", "Cat");
    8. System.out.println(map);
    9. for (var s : list) {
    10. System.out.println(s);
    11. }
    12. // 应该这样使用
    13. var list2 = new ArrayList();
    14. list2.add("1");
    15. list2.add("2");
    16. list2.add("3");
    17. // 属性字段不能用var
    18. private var list = new ArrayList();
    19. // 方法参数不能用var
    20. public void test(var list) {
    21. System.out.println("123");
    22. }

    虽然多了var这个关键字,但我想真正习惯这种用法的人毕竟还是少数吧。而且对于大多数码农来说,如果在接手的系统中看到这种「新式」代码,可能会有点懵。至于其他新增的特性,基本都是鸡肋。


    感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

  • 相关阅读:
    亲爱的朋友
    问题解决:使用VISIO导出为PDF,在Latex中有白色边框以及黑色线框的问题
    Redis 集群偶数节点跨地域部署之高可用测试
    C++:char和char16_t相互转换
    规范系列之代码提交日志
    5g双频千兆无线路由器工业级
    ACP敏捷.知识领域学习
    Golang开发软件
    [汇编语言]寄存器(内部访问)
    2023-09-20 事业-代号z-个人品牌-数据库内核专家-分析
  • 原文地址:https://blog.csdn.net/lostrex/article/details/127893180