首页IT科技java新特性函数式方法(Java新特性(1):Java 9和Java10)

java新特性函数式方法(Java新特性(1):Java 9和Java10)

时间2025-09-08 03:35:55分类IT科技浏览4833
导读:您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~...

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

自从Java在2009年被Oracle收购之后                       ,就不再开源            ,除了Oracle官方发布的版本之外        ,还有OpenJDK版本                       ,这两者的区别可以自行找某度去搞明白                。对于没有几千万用户的应用来说                ,OpenJDK已经足够了    ,即使是一些大厂                       ,内部系统用OpenJDK也足够了                       。

Java 8开始                    ,整个JDK就一直在致力于不断改进,不断融合新的开发特性       。Java目前始终保持前向兼容                   ,所以如果有新的稳定版JDK出来                        ,就可以立即使用新的JDK    ,尝试一些新特性               ,而不必担心不兼容的问题(可能个别地方有改动                       ,但对个人及小型开发来说可以忽略不计)            。

先做一些名词解释:

1               、JEP:Java Enhancement Proposals        ,Java增强提案                        。

2                       、JSRJava Specification Requests的缩写            ,意思是Java规范提案                       ,是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求           。

3        、CSR:是Compatibility & Specification Review的缩写            ,也就是兼容性和特征检视        。

4            、?标记:是那些未在官方JEP中列出        ,但明确在该版本Java API中具有                       ,而前一版本API没有的特性                        。

先来看看Java9增加一些特性:

Java9主要的改进包括模块系统261)                       、JShell222)            、日志集成264)        、弃用GC组合(214)                       、统一JVM日志(158)                、统一GC日志(271)    、集合工厂方法269)                       、G1作为默认GC248)                    、废弃CMS GC(291)、Http 2 Client110)                   、私有接口方法(?)                        、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这个关键字                       ,但我想真正习惯这种用法的人毕竟还是少数吧。而且对于大多数码农来说                ,如果在接手的系统中看到这种「新式」代码    ,可能会有点懵                    。至于其他新增的特性                       ,基本都是鸡肋                       。

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

声明:本站所有文章                   ,如无特殊说明或标注                        ,均为本站原创发布                。任何个人或组织    ,在未征得本站同意时               ,禁止复制、盗用                   、采集                        、发布本站内容到任何网站    、书籍等各类媒体平台                       。如若本站内容侵犯了原著者的合法权益                       ,可联系我们进行处理       。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
韩国服务器租用平台(韩国网站服务器好处有哪些) win11联网后怎么跳过微软登录(Win11网络连接用不了怎么办?Win11网络连接用不了的解决方法)