从Java9到Java17在上一篇文章中,我们回顾了Java9的一些特性,今天我们就来看看Java10带来了哪些特性。之所以有必要总结一下Java8到Java17的特点,是因为Java社区对Java17的重视程度空前的高,话不多说,让我们走进Java10。Java10从Java10开始,迭代周期Java缩短为半年,每六个月发布一个版本。局部变量类型推断在Java6中初始化一个Map需要我们这样声明它:Mapma??p=newHashMap();其实泛型方法的参数是可以从上下文推导出来的,所以在Java7中,简化为:Mapma??p=newHashMap<>();Java10进一步升华了类型推断,我们来看一个例子:varmap=Map.of("hello","world");Stringvar=map.get("hello");乍一看,我以为是Javascript写的,其实这就是Java。编译器根据右侧初始化器的类型推断出初始化器类型,这将大大减少一些样板代码。但需要注意的是,该特性仅适用于初始化局部变量,不能用于成员变量、方法参数、返回类型等场景。另外需要注意的是var不是Java中的关键字,这保证了Java的向后兼容性。此外,使用var没有运行时开销,也不会使Java成为动态语言。标记为var的变量的类型仍然在编译时推断。var不应该被滥用虽然这很“酷”,但是var不应该被滥用。下面的写法可读性很差,变量的类型需要你DEBUG:vardata=someObject.getData();Stream流中尽量不要使用://可读性差varnames=apples.stream().map(Apple::getName).collect(Collectors.toList());因此,使用var时应保证必要的可读性。另外,在多态这一Java的重要特性中,var也没有完美的表现。如果Fruit同时具有Apple和Orange实现。varx=newApple();如果我们将x重新赋值给newOrange(),就会报错,因为x的类型在编译后已经固定了。所以var和泛型一样,在编译过程中发挥作用。您必须确保已确定var的类型。那么,当var与通用菱形符号<>组合时会发生什么?下面的empList的类型是ArrayList:varempList=newArrayList<>();如果我们需要指定集合全部为Apple则必须在右侧显式声明:varapples=newArrayList();不可变集合其实不可变集合在Java9中得到了加强,在Java10中不可变集合又得到了进一步的加强。为什么不可变集合变得如此重要呢?不变性,这是函数式编程的基石之一,因此加强不可变集合有助于Java中的函数式编程。安全性,因为集合是不可变的,不存在竞争条件,天然的线程安全性,无论是在编码过程还是内存使用上都有一定的优势,这个特性在Scala和Kotlin这两种编程语言中大放异彩。在Java10中引入了一些新的API。集合副本将集合复制为不可变集合:ListcopyList=List.copyOf(apples);任何修改此类集合的尝试都将导致java.lang.UnsupportedOperationException。在Stream被归类为不可变集合之前,StreamAPI的归纳操作collect(Collector收集器)只会将流归纳为可变集合。现在它们都有相应的不可变集合。例如:Listnames=apples.stream().map(Apple::getName).collect(Collectors.toUnmodifiableList());Optional.orElseThrow()Optionaloptional=Optional.ofNullable(nullableVal);//有可能是NoSuchElementExceptionStringnullable=optional.get();如果Optional的值为null,则为null时会抛出NoSuchElementException。从语义上来说,get应该可以得到一些东西,但实际上是不正常的,歧义太大了。因此添加了orElseThrow()方法来增强语义。其他增强Java10的性能也得到了显着增强,支持G1并行垃圾回收。此外,还引入了即时编译技术(JIT),可以加快java程序的运行速度。此外,Java10还对容器集成进行了优化,JVM会根据容器的配置来选择CPU核心数和内存使用量。还有其他一些底层的优化特性,这里就不说了。理解是最主要的。当你达到一定程度时,你自己就会明白。至此,总结了Java10的一些变化。其实变化不多,都是很容易掌握的。敬请期待,不要走开,下次我们将汇总Java11的一些变化和改进。本文转载自微信公众号“码农小胖哥”,您可以通过以下方式关注二维码。转载本文请联系码农小胖公众号。