写点什么

谈谈 Java8-18 引入的新特性

作者:CRMEB
  • 2022 年 4 月 06 日
  • 本文字数:2146 字

    阅读完需:约 7 分钟

谈谈Java8-18引入的新特性

Java8 于 2014 年 3 月 18 日发布,截止到 2022 年 4 月 6 日,当前最新发行版本是 Java18。版本 17、11 和 8 是目前支持的长期支持(LTS)版本。这篇文章带领大家回顾从 Java 8 开始每个版本的特性,小板凳坐好,发车了!

版本概览

Java8 LTS 上一次商业用途的免费软件公共更新是在 2019 年 1 月由 Oracle 发布的,而 Oracle 继续更新并发布免费的公共 java8,用于开发和个人用途。java7 不再受公众支持。对于 java11,Oracle 不会为公众提供长期支持; 相反,更广泛的 OpenJDK 社区,如 Eclipse Adoptium 或其他社区,将会替代 Oracle 提供这类的支持。



上图展示了从 Java SE 8 开始到 Java SE 18 的历史版本发布过程,秉着 2017 年 9 月,Java 平台的首席架构师 Mark Reinhold 提议将发布列车改为“每六个月发布一个特性”的约定,也给出了未来到 Java SE 21 的发布规划。

Java18 的一般可用性开始于 2022 年 3 月 22 日,最新的(第三次) LTS Java 17 开始于 2021 年 9 月 14 日。java19 正在开发中,早期访问构建已经可用。

Java 8 特性

Lambda 表达式允许我们使用函数作为方法参数。

让我们来看看 Java 8 之前的代码,当时我们必须创建一个匿名类来实现一个简单的接口。

Thread t = new Thread(new Runnable() { public void run() {  System.out.println("Start thread"); }});复制代码
复制代码

使用 lambda 表达式,我们可以这样做。

Thread t1 = new Thread(() -> { System.out.println("Start 1st thread");});复制代码
复制代码

函数接口是只有一个抽象方法的接口。此外,Interface 可以有默认方法和静态方法,但只有一个抽象方法。

Stream 是java.util.Stream包中的一个接口,它提供了对集合执行顺序和并行操作的方法。Collection Interface 的 Stream ()方法返回给定集合的类型为 Stream 的元素流。流接口支持过滤、映射或查找流中元素的聚合结果所需的许多操作。

在下面的实例,我们调用 List 上的 stream ()方法,然后将 Predicate (Functional Interface)传递给返回布尔值的 anyMatch ()方法。

List<String> colors = new ArrayList<>(Arrays.asList("Green","Yellow","Red"));boolean isTrue = colors.stream().anyMatch(x -> x.equals("Red"));System.out.println(isTrue);复制代码
复制代码

Optional 可创建一个容器对象,该对象可能包含也可能不包含非空值,通过使用 它,我们可以 isPresent ()来检查一个值是否为非空。

在下面的示例中,我们使用 Stream Interface 的 findAny ()方法返回一个 Optional 对象。基于可选实例的值,我们可以执行相应的逻辑。

List<String> colors = new ArrayList<>(Arrays.asList("Green","Yellow","Red"));Optional<String> color = colors.stream().filter(x -> x.equals("Black")).findAny();System.out.println(color.isPresent()? color.get() : "Not Found");复制代码
复制代码

对 java.util.concurrent 包的更改:

  • 引入了 Interface CompletionStage、 Class CompletableFuture 和 CompletionException。

  • CompletableFuture 可以帮助执行异步任务,这些任务比在 java8 之前存在的 Future 对象更加灵活和增强。

Method References (::) ,我们可以使用双冒号来调用现有的方法,而不是使用 lambda 表达式。方法引用可以用来引用静态方法和实例方法。

下面演示一个引用静态方法的示例。首先,让我们使用 lambda 表达式实现一个方法调用。

public class Main {    public static void main(String[] args)  {     List<Integer> locList = new ArrayList<>(Arrays.asList(1,2,5,6));     boolean isFound = locList.stream().anyMatch(l -> isEqual(l));     System.out.println(isFound);    }    public static <T> boolean isEqual(T a) {    Predicate<T> isEqual = (x) -> x.equals(5);    return isEqual.test(a);    }}复制代码
复制代码

isEqual ()是 Main 类中的一个静态方法,因此我们可以简单地使用方法引用来完成工作,而不是使用 lambda 表达式来调用该方法。

public class Main {    public static void main(String[] args)  {     List<Integer> locList = new ArrayList<>(Arrays.asList(1,2,5,6));     boolean isFound = locList.stream().anyMatch(Main::isEqual);     System.out.println(isFound);    }    public static <T> boolean isEqual(T a) {     Predicate<T> isEqual = (x) -> x.equals(5);     return isEqual.test(a);    }}复制代码
复制代码

篇幅有限,除了上面讲到的新特征,还有几个重要的,包括当不限于:

  • Parallel Array Sorting (并发数组排序)

  • Date & Time API (日期和时间操作接口,LocalDate,ZoneId,Clock)

  • Base64 encoding and decoding (Base64 编码和解码自支持)

  • Permanent Generation(Metaspace 将根据我们在运行时的需求来重新调整本身)


未完待续,下面继续讲各个版本的新特性,敬请期待!

最后

如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163 相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点 star:http://github.crmeb.net/u/defu不胜感激 !

完整源码下载地址:https://market.cloud.tencent.com/products/33396

PHP 学习手册:https://doc.crmeb.com

技术交流论坛:https://q.crmeb.com

用户头像

CRMEB

关注

还未添加个人签名 2021.11.02 加入

CRMEB就是客户关系管理+营销电商系统实现公众号端、微信小程序端、H5端、APP、PC端用户账号同步,能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、网络营销的一款企业应用

评论

发布
暂无评论
谈谈Java8-18引入的新特性_CRMEB_InfoQ写作平台