Java10 新特性

摘要:
//打开jdk。Java语言net/projects/jdk/10/II。JDK10中的12个JEP。3.局部变量类型推断。1.背景:开发人员经常抱怨Java中引用代码的范围。局部变量的显示类型声明用于首次声明变量类型。包含复杂泛型结构变量的返回值类型的声明类型很复杂,编写起来很长,特别是使用Iterator<
一、JDK10 发布

  2018321日, Oracle官方宣布Java10正式发布。

  需要注意的是 Java 9 Java 10 都不是 LTS (Long-Term-Support) 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而未来的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本

  JDK10一共定义了109个新特性, 其中包含12JEP对于程序员来讲, 真正的新特性其实就一个) , 还有一些新APIJVM规范以及JAVA语言规范上的改动。

  JDK1012JEPJDK Enhancement Proposal特性加强提议) 参阅官方

  文档:http://openjdk.java.net/projects/jdk/10/

  

二、JDK10中的12个JEP

  Java10 新特性第1张

三、局部变量类型推断

  1、背景

    产生背景:开发者经常抱怨Java中引用代码的程度。 局部变量的显示类型声明,常常被认为
是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续。

    好处:减少了啰嗦和形式的代码,避免了信息冗余,而且对齐了变量名,更容易阅读!

  2、举例

    场景一:类实例化时

      作为 Java开发者, 在声明一个变量时, 我们总是习惯了敲打两次变量类型, 第一次用于声明变量类型, 第二次用于构造器。

LinkedHashSet<Integer> set = new LinkedHashSet<>();


    场景二:返回值类型含复杂泛型结构

      变量的声明类型书写复杂且较长,尤其是加上泛型的使用

Iterator<Map.Entry<Integer, Student>> iterator = set.iterator();

    场景三:

      我们经常声明一种变量,它只会被使用一次,而且是用在下一行代码中,比如:

URL url = new URL("http://www.baidu.com");
URLConnection connection = url.openConnection();
Reader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));

  尽管 IDE可以帮我们自动完成这些代码,但当变量总是跳来跳去的时候,可读性还是会受到影响,因为变量类型的名称由各种不同长度的字符组成。而且,有时候开发人员会尽力避免声明中间变量,因为太多的类型声明只会分散注意力,不会带来额外的好处

  3、局部变量类型推断

    适用于以下情况:

 1   //1.局部变量的初始化
 2   var list = new ArrayList<>();
 3 
 4   //2.增强for循环中的索引
 5   for(var v : list) {
 6       System.out.println(v);
 7   }
 8 
 9   //3.传统for循环中
10   for(var i = 0;i < 100;i++) {
11       System.out.println(i);
12   }

    在局部变量中使用时,如下情况不适用:

      ① 初始值为 null

      Java10 新特性第2张

      ② Lambda 表达式

      Java10 新特性第3张

      ③ 方法引用

      Java10 新特性第4张

      ④ 为数组静态初始化

      Java10 新特性第5张

    不适用以下的结构中:

      ① 没有初始化的局部变量声明;

      ② 方法的返回类型

      ③ 方法的参数类型

      ④ 构造器的参数类型

      ⑤ 属性

      ⑥ catch 块

  4、工作原理

    工作原理

      在处理 var 时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中

    注意:

      var不是一个关键字

      你不需要担心变量名或方法名会与 var发生冲突, 因为 var实际上并不是一个关键字,而是一个类型名, 只有在编译器需要知道类型的地方才需要用到它。 除此之外, 它就是一个普通合法的标识符。 也就是说, 除了不能用它作为类名, 其他的都可以,但极少人会用它作为类名
  

      这不是 JavaScript

        首先我要说明的是, var并不会改变Java是一门静态类型语言的事实。 编译器负责推断出类型, 并把结果写入字节码文件, 就好像是开发人员自己敲入类型一样。下面是使用 IntelliJ(实际上是 Fernflower的反编译器)反编译器反编译出的代码:

      Java10 新特性第6张

 

四、集合新增创建不可变集合的方法

  自 Java 9 开始, Jdk 里面为集合(List / Set / Map) 都添加了 of (jdk9新增)copyOf (jdk10新增)方法, 它们两个都用来创建不可变的集合, 来看下它们的使用和区别。

  Java10 新特性第7张

  从 源 码 分 析 , 可 以 看 出 copyOf 方 法 会 先 判 断 来 源 集 合 是 不 是AbstractImmutableList 类型的, 如果是, 就直接返回, 如果不是, 则调用 of
建一个新的集合。

  示例2因为用的 new 创建的集合, 不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例, 所以为false

  注意:使用ofcopyOf创建的集合为不可变集合, 不能进行添加、 删除、 替换、排序等操作, 不然会报 java.lang.UnsupportedOperationException 异常。

  上面演示了 List of copyOf 方法, Set Map 接口都有。

 

免责声明:文章转载自《Java10 新特性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇不佳设计的七个致命借口(转载(ZDNet))Yii2框架---常用代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IE8+兼容经验小结

最近一段时间,我都使用Flask+Bootstrap3的框架组合进行开发。本文就是在这种技术组合下,分享IE8+兼容性问题的解决方法。根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK了(这里的IE8+主要是指IE8,据个人目测,IE9+的渲染效果已经非常好了)。...

使用U盘安装mint

系统坏了,重新装的时候,硬盘甚至都没法格式化。。。所以,狠狠心买了块固态硬盘,123G,威刚。 想自己装Linux系统,这样用起来更方便一点,不用装虚拟机,然后再跑linux什么的。最后选了mint。 好嘛,问题来了,怎么装上去? 其实,找张空盘,把系统刻上去,这可能是最省力的方法了。但是,问题是另一台笔记本没有光驱。so。。。只能考虑u盘。 最初,是想尝...

Android 开发环境搭建

JDK配置 安装完成之后: 我的电脑——右键属性——高级系统设置——环境变量——系统变量新建——变量名JAVA_HOME   变量值为所安装JDK的根文件夹,如F:Javajdk1.7.0_60——确定 系统变量PATH——编辑——末尾加上; %JAVA_HOME%in;%JAVA_HOME%jrein;——确定 确认: 控制台java –versio...

(转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)

在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix。它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是如果你在shader里面不使用这个变量的话,OpenGL底层会把它优化掉。 但是,CC_MVPMatrix是在什么时候设置进来的呢?我在shader里面明...

驼峰式命名法、帕斯卡命名法

骆驼式命名法(Camel-Case) 又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。 骆驼式命名法就是当变量名或者函数名是由一个或者多个单词连结在一起,而构成的唯一识别...

windows下的shellcode剖析浅谈[转自看雪]

标 题: 【原创】windows下的shellcode剖析浅谈作 者:snowdbg时 间: 2009-10-06,11:12链 接: http://bbs.pediy.com/showthread.php?t=99007  今天是中秋节,正好我的文章在今天基本完成,作为中秋礼物送给大家,由于本人水平有限希望大家多多批评指正!学习了好些日子了,思路总是乱...