局部变量类型推断是一个备受争议的话题,但Java10为JVM中的垃圾收集和容器感知带来了可喜的变化。关于本系列您认为您了解Java编程吗?事实上,大多数开发人员只是触及Java平台的皮毛,学习只是为了完成他们的工作。在这个正在进行的系列中,JavaTechnologies深入探讨了Java平台的核心功能,提供了可以帮助您解决最棘手的编程挑战的提示和技巧。Java?开发人员习惯于等待新Java版本的发布,但新的高频发布节奏改变了这一点。在Java9发布仅6个月后,现在Java10正在敲门。再过6个月,我们将拥有Java11。一些开发人员可能会觉得这种快速发布是多余的,但新的节奏标志着长期需要的改变。与其版本号一样,Java10提供了10个新特性,本文介绍了我认为最重要的5个特性(您可以在OpenJDK10项目页面上查看它们)。Java的新版本节奏从历史上看,JDK发布的节奏一直由重要的新功能驱动。作为最近的示例,Java8以lambda和流的形式引入了函数式编程,而Java9引入了模块化Java系统。每个新版本都备受期待,但小修复通常会被搁置,等待更大的组件版本完成。Java的发展落后于其他语言。一种新的高频节奏以较小的增量推动Java向前发展。将包括在发布日期前就绪的功能,而无法安排在仅6个月后的下一个版本中发布的功能。这个新周期下的第一个Java版本是Java9,它于2017年10月发布。Java10于2018年3月发布,Java11将于2018年9月发布。作为新节奏的一部分,Oracle表示将只支持每个主要版本直到下一个主要版本。Java11发布后,Oracle将停止支持Java10。支持Java版本的开发人员必须每6个月迁移一次主要版本。不想或不需要频繁迁移的开发人员可以使用每三年更新一次的LTS(长期支持)版本。当前的LTS版本Java8将在今年秋天发布Java11之前得到支持。局部变量类型推断局部变量类型推断是Java10中最显着的特性。争论一直持续到JDK10,该特性允许编译器推断局部变量的类型,而不需要程序员显式指定它。清单1显示了如何在Java10之前定义String变量类型。清单1.声明和分配类型为StringStringname="Alex"的变量清单2显示了Java10中String类型变量的定义清单2.推断变量具有局部变量类型varname="Alex"的String类型;如您所见,唯一的区别是使用了var保留类型名称。使用右边的表达式,编译器可以推断出变量名的类型为String。这看起来有点简单,那么让我们看一个更复杂的例子。如果一个变量赋值给调用方法的返回值怎么办?在这种情况下,编译器可以从方法的返回类型推断变量的类型,如清单3所示。清单3.从返回类型推断String类型varname=getName();StringgetName(){return"Alex";}使用局部变量类型顾名思义,局部变量类型推断仅适用于局部变量。它不能用于定义实例或类变量,也不能用于方法参数或返回类型。但是,您可以在类和增强循环中使用var,并且可以从迭代器中推断出类型,如清单4所示。清单4.在循环中使用varfor(varbook:books){}for(vari=0;i<10;i++){}使用这种类型最明显的原因是减少代码的冗长。看一下清单5中的示例。清单5.很长的类型名称使代码很长什么。清单6.var类型减少了代码的冗长该类型在.右侧的每个声明中被提及一次。想象一下使用这种在某些Java框架中很常见的长类名的好处。局部变量类型的问题1.var屏蔽类型您已经看到var如何提高代码可读性,但另一方面,它也可以屏蔽类型。查看清单7中的示例。清单7.返回类型不明确varresult=searchService.retrieveTopResult();在清单7中,我们必须猜测返回类型。让读者猜测发生了什么的代码很难维护。2.var不能与lambdas一起使用与lambda表达式一起使用时,类型推断效果不佳,主要是编译器缺少类型信息。清单8中的lambda表达式将不会被编译。清单8.类型信息不足Functionquotify=m->"'"+message+"'";varquotify=m->"'"+message+"'";在清单8中,编译器右侧的表达式公式中没有足够的类型信息来推断变量类型。Lambda语句必须始终声明显式类型。3.var不能与菱形运算符混合使用类型推断也不能很好地与菱形运算符一起使用。查看清单9中的示例。清单9.将菱形运算符与varvarbooks=newArrayList<>();结合使用亲自尝试要亲自尝试局部变量类型推断,您需要下载JDK10和支持它的IDE。IntelliJ的EAP(早期访问程序)版本具有此支持。下载并安装后,您可以从本文随附的GitHub存储库中检出代码开始。您会在那里找到局部变量类型推断的示例。在清单9中,书籍ArrayList的参数类型是什么?您可能了解您希望ArrayList存储书籍列表,但编译器无法推断出这一点。相反,编译器唯一要做的就是推断这是一个Object类型的ArrayList:ArrayList