为什么选择 Java 8 ?

为什么Java老手都推荐装JDK 8?从版本选择到目录结构,一次给你讲明白 本文深入解析了为什么Java老手普遍推荐使用JDK 8,从LTS支持、语言特性到生态系统稳定性等多个维度进行分析。同时详细介绍了JDK的目录结构设计、环境配置最佳实践以及版本升级的考量因素,帮助开发者做出明智的版本选择。 阅读详情

本文是 DZone 指南 Java 生态系统的专题文章。点击链接可阅读更多见解深刻的文章、行业统计信息,系 OneAPM工程师编译整理。

这里写图片描述

要点速递

  • 在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调优。
  • Lambda 表达式、 Streams API 以及现有类的新方法都是提高生产力的重要工具。
  • Java8 新推出的 Optional 类型在处理 null 值时,能减少 NullPointerExceptions 的可能性,给开发者极大的灵活度。

去年年初,Java8 粉墨登场,现在 Java7 便已行将就木。在明年底 Java9 推出之前,Java8 是 Oracle 唯一支持的版本。然而,许多公司都将稳定性放在第一位,所以都还在用 Java7,甚至 Java6。

让我们来了解一下 Java8 的一些特性,让你在说服团队升级 Java 版本时理由能更充分一些。

速度更快

可以取悦老板、满足业务或运营人员的一大卖点是:Java8 运行应用时速度更快。通常,升级至 Java8 的应用都能得到速度上的提升,即便没有做任何改变或调优。对于为了迎合特定 JVM 而做出调整的应用,这或许并不适用。但 Java8 性能更优的理由还有很多:

常见数据结构的性能提升:对广受欢迎的 HashMap 进行的基准测试表明,它们在 Java8 中的性能更好。这种提升非常吸引人——你无需学习新的 Streams API 或 Lambda 语法,甚至不需要改变现有的代码,就能提升应用的性能。

垃圾回收器提升:通常,Java 应用性能取决于垃圾回收的效率。的确,糟糕的垃圾回收会很大程度上影响应用性能。Java8 对垃圾回收做了很多改变,能有效提升性能并简化调优。最为人熟知的改变是 PermGen 的移除与 Metaspace 的引入。

Fork/Join 速度提升:fork/join 框架是在 Java7 中首次引入的,目的是简化使用 JVM 的并发程序。Java8 中投入了很多努力进一步提升该框架。现在,fork/join 在 Streams API 中用于并发操作。

此外,Java8 中还包含诸多改进以支持并发。Oracle 在 JDK 8 中总结了这些性能提升。

代码行更少

Java 经常被人们诟病其样本代码太多。为此,Java8 新的 API 采用了更具功能性的方式,专注于实现什么而不是如何实现。

Lambda 表达式

Java8 中的 Lambda 表达式不仅是 Java 已有的匿名内部类—— Java8 推出之前传递行为的方法之外的语法糖衣。Lambda 表达式采用了 Java 7 的内部改变,因此运用起来相当流畅。想了解如何使用 Lambda 表达式简化代码,请继续阅读。

集合新方法介绍

Lambda 表达式与 Streams 可能是 Java8 最大的两个卖点,较少为人知的是 Java 现在允许开发者给现有类添加新的方法,而无需为了向后兼容性折中。这样,新的方法,结合 Lambda 表达式,能在很大程序上简化代码。比如,我们常常需要判断 Map 中的某个成员是否已经存在,如果不存在则创建之。在 Java8 之前,你可能会这么做:

private final Map<CustomerId, Customer> customers = new HashMap<>();

public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.get(customerId);
if (customer == null) {
    customer = new Customer(customerId);
    customers.put(customerId, customer);
}
customer.incrementOrders();
}

操作“检查某个成员在 map 中是否存在,若不存在则添加之”是如此常用,Java 现在为 Map 添加了一个新方法 computeIfAbsent 来支持这个操作。该方法的第二个参数是一个 Lambda 表达式,该表达式定义了如何创建缺少的成员。

public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.computeIfAbsent(customerId,
       id -> new Customer(id));
customer.incrementOrders();
}

其实,Java8 还有一个新的特性,称为方法引用(method references),它能使我们用更简洁的代码实现该功能:

public void incrementCustomerOrders(CustomerId customerId) {
Customer customer = customers.computeIfAbsent(customerId, Customer::new);
customer.incrementOrders();
}

Java8 为 Map 与 List 都添加了新方法。你可以了解一下这些新方法,看它们能节省多少行代码。

Streams API

Streams API 为查询、操纵数据提供了更多灵活度。这是一个很强大的功能。阅读这些文章能对 Streams API 有更全面的了解。在大数据时代建立流畅的数据查询会非常有趣,而且也是常用的操作。比如,你有一列书,你希望按照字母表顺序排列这些书的作者名,且不含重复。

public List<Author> getAllAuthorsAlphabetically(List<Book> books) {
List<Author> authors = new ArrayList<>();
for (Book book : books) {
    Author author = book.getAuthor();
    if (!authors.contains(author)) {
        authors.add(author);
    }
}
Collections.sort(authors, new Comparator<Author>() {
    public int compare(Author o1, Author o2) {
        return o1.getSurname().compareTo(o2.getSurname());
    }
});
return authors;
}

在上面的代码中,我们首先遍历这列书,如果书的作者从未在作者列表出现,则添加之。之后,我们根据作者的姓氏按字母表顺序对这些作者排序。这种排序操作正是 Streams 擅长解决的领域:

public List<Author> getAllAuthorsAlphabetically(List<Book> books) {
return books.Streams()
            .map(book -> book.getAuthor())
            .distinct()
            .sorted((o1, o2) -> o1.getSurname().compareTo(o2.getSurname()))
            .collect(Collectors.toList());
}

上面的做法不仅代码行更少,而且描述性更强——后来的开发者读到这段代码能够轻易理解:1、代码从书中获取作者姓名。2、只在意从未出现过的作者。3、返回的列表按照作者姓氏排序。将 Streams API 与其他新特性——方法引用(method references)、比较器(Comparator)的新方法结合使用,可以得到更加简洁的版本:

public List<Author> getAllAuthorsAlphabetically(List<Book> books) {
return books.Streams()
            .map(Book::getAuthor)
            .distinct()
            .sorted(Comparator.comparing(Author::getSurname))
            .collect(Collectors.toList());
}

这里,排序方法按照作者姓氏排序,更加显而易见了。

便于并行

此前我们浅聊过更利于开箱即用的性能,除了前面提到过的特性,Java8 能更好地利用 CPU 内核。将前例中的 Streams 方法替换为 parallelStreams,JVM 会将此运算分解为不同的任务,使用 fork/join 将这些任务运行在多个核上。然而,并行化并不是加速所有运算的魔法。并行化运算总是会带来更多工作——分解运算,整合结果,因此无法总是减少时间。但是,对适合并行化的例子,这么做还是颇有效率的。

最大化减少 Null 指针

Java8 的另一个新特性是全新的 Optional 类型。该类型的含义是“我可能有值,也可能是 null。“这样一来,API 就可以区分可能为 null 的返回值与绝对不会是 null 的返回值,从而最小化 NullPointerException 异常的发生几率。

Optional 最赞的用处是处理 null。例如,假设我们要从一个列表中找一本特定的书,新创建的 findFirst() 方法会返回 Optional 类型的值,表明它无法确保是否找到特定的值。有了这个可选择的值,我们接下来可以决定,如果是 null 值要如何处理。如果想要抛出一个自定义的异常,我们可以使用 orElseThrow:

public Book findBookByTitle(List<Book> books, String title) {
Optional<Book> foundBook = books.Streams()
       .filter(book -> book.getTitle().equals(title))
       .findFirst();
return foundBook.orElseThrow(() -> new BookNotFoundException("Did not find book with title " + title));
}

或者,你可以返回其他书:

return foundBook.orElseGet(() -> getRecommendedAlternativeBook(title));

或者,返回 Optional 类型,这样,该方法的调用者可以自己决定书没找到时要怎么做。

总结

Java8 作为 Java 语言的一次重大发布,包含语法上的更改、新的方法与数据类型,以及一些能默默提升应用性能的隐性改善。Oracle 已经不再支持 Java 7,因此许多公司都被迫向 Java8 转移。好消息是,Java8 对业务、现有的应用以及期望提高生产力的开发者都好好多。原文地址

OneAPM for Java和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。想阅读更多技术文章,请访问 OneAPM 官方博客。

为什么Java开发者还在用JDK1.8?Eclipse兼容性实测与版本选择指南 本文深入探讨了Java开发者持续使用JDK1.8的原因,包括Lambda表达式带来的编程革命、稳定的API设计以及与Eclipse IDE的出色兼容性。通过实测数据展示JDK1.8在性能、内存占用和调试稳定性方面的优势,并提供配置建议和升级策略,帮助开发者做出明智的版本选择。 阅读详情

相关推荐

jdk8 jvm 参数图(随手参考好资料)

常用jvm参数都在这张图中,参考起来方便,是国外大神整理的

为什么大家还在使用java8

1、2019年1月Oracle宣布Java8开始收费了,JDK 8u211版本(包含)开始收费了。感觉这也是最主要的一个原理。4、Oracle必尽是个商业公司与之前的Sun理念不一样,高斯林及sun的元老们也慢慢离开了Oracle公司。2、从Java9开始,基本就是每半年一个版本,这个更新速度,导致很多企业没法跟随。因为迁移升级都有成本。目前很多企业还在使用JDK8,当然现在Oracle推出的免费版本JDK17相信这种局面应该会有所改变。3、从Java8后续升级的很多版本拥有的新功能大部分都用不上。

Hanko的专栏 4962

海康威视HiTools实战:5分钟搞定工业镜头选型(附避坑指南)

本文详细解析了海康威视HiTools在工业镜头选型中的应用,通过五步操作流程帮助用户快速匹配适合的镜头型号。文章深入探讨了工业视觉系统的核心参数,包括焦距、视野、景深和畸变控制,并提供了光源搭配和系统集成的实战指南,助力提升机器视觉检测精度与效率。

u0v1w2x3的博客 1056

为什么很多企业依然再用jdk8而不是使用最新版本jdk17?

兼容性问题:JDK 8 是一个经过长期使用和测试的稳定版本,与许多企业应用程序和库已经兼容,而升级到新版本可能会导致兼容性问题。如果企业依赖于过时的库或框架,则升级到 JDK 17 可能会增加安全风险,因为这些库可能不支持最新版本的 JDK,从而使企业的系统容易受到攻击。如果企业在 JDK 8 上运行的应用程序已经满足其性能要求,则他们可能不愿意冒着在升级时引入性能问题的风险。综上所述,虽然 JDK 17 有很多新功能和改进,但是在升级之前,企业需要考虑到兼容性、安全、维护和性能等方面的问题。

千锋教育 3808

第十二节:C#工业控制编程基础--输出正弦波实验

第十二节:基于c#使用开发板输出正弦波实验 文章目录第十二节:基于c#使用开发板输出正弦波实验一、实验目的:了解采集卡DA相关函数的使用。二、实验内容:利用C#生成正弦波,然后用采集卡DA输出。三、实验步骤:1.打开Visual Studio 2013,新建窗体应用程序项目,配置好板卡dll文件。2.在窗体中放入控件,对控件进行布局排版,并修改他们的Name属性和Text属性。3.在Chart控件内选择Spline型图表,如图2。4.进入编程区域,在public partial class Form1 :

weixin_49237052的博客 2295

abaqus wcm插件下载_Abaqus随机短纤维增强复合材料建模插件

文末附Abaqus随机短纤维增强复合材料建模插件下载链接前言短纤维增强复合材料相对于长纤维增强复合材料来说更容易制备,且短纤维的填充性能略有改善,可制造复杂产品,广泛应用于车辆、航空航天、建筑等行业,对短纤维增强复合材料进行细观力学分析,可对其宏观力学性能进行预测、分析破坏机理等。接下来对随机短纤维增强复合材料建模插件进行介绍。NO.1 【算法简介】难点一:此插件核心在于判断生成的纤维是...

weixin_39974882的博客 2833

为什么使用java8_为什么java8还在被大量使用?

对于许多人来说,新版本的许多功能都值得期待,他从功能开发到预览一直都在关注。就其本身而言,升级的好处远远大于升级的工作量。由于Java本身的兼容性问题,升级版本的工作量要小得多。但是对于某些人来说,情况有所不同。他可能没有注意这些事情。我没有注意它,所以我不知道很多事情要理解。因此,他们认为Java8易于使用,仅此而已。对于他来说,此时升级到Java8并不划算。因为一次要在他面前摆一些东西,所以他...

weixin_32512451的博客 2199

IBM X3650 M4做raid阵列

步骤1.开机出现此界面,同时按ctrl键和h键,进入IBM X3650 M4配置raid界面。 【注】不知道是不是因为我的服务器长期闲置,按键ctrl键和h键居然无法进入raid配置界面。这时候,我们可以进bios同样可以进入raid配置界面。如果你按ctrl键和h键就可以直接进入raid配置界面,那么请忽略此段,直接看步骤2 开机,按键F1,选中system setting ,接着选中Adapters and UEFI Drivers ...

ani5565的博客 2万+

java17都快出了,为什么现在大多还在用java8

下面是甲骨文官网截的图,可以看到,java8和java11都是LTS版本,LTS即Long-term_Support,就是长期支持版,从下图可以看到java8会一直被支持到2022年3月,它的扩展更是会到2030年12月,java11则会被一直支持到2023年11月,扩展回到2026年11月。像java8后边出来的好多版本比如下图中的java9,java10不是LTS版本,所以现在已经不被支持了。这就是为什么java17都快除了,现在大都还在用java8的原因。为什么现在都在用java8或者java11?.

m0_67403188的博客 1437

Macbook Pro上如何修改brew源

一、需求说明 我的macbook电脑安装了中科大的brew源码,发现安装gpg工具失败,其他工具可以正常安装,为了能将gpg安装成功,就找了找切换brew源的方案,记录如下。 二、切换至国内源 由于使用github默认源有可能存在路径远或者部分服务访问超时的原因,切换至国内源可以提速。 2.1 替换brew.git $ cd "$(brew --repo)" # 中国科大: $ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git #

bufegar0的博客 1078

阿里云导出的镜像raw转换成vmdk格式工具

阿里云导出的镜像raw转换成vmdk格式工具 1.安装java环境,安装教程不介绍了 2.raw2vmdk软件下载: 在我的链接里面: 3.使用 打开cmd.bat软件: java -jar raw2vmdk.jar (原镜像)C:\\images\\raw\\disk.img (转换的镜像)D:\\images\\vmdk\\disk.vmdk 4.vmware打开vmdk文件 ...

3843

Java8-为什么选择java8

Java的演变过程 Java从头到尾都是被设计成为一门面向对象的语言,所以时间长了,它就积累了很多的有用的库。从头开始,他就拥有多线程处理的能力。最重要的是Java里面有两个非常强大非常超前的两个概念:jvm和Java字节码。 Java虚拟机( JVM)及其字节码可能会变得比Java语言本身更重要,而且对于某些应用来说, Java可能会被同样运行在JVM上的竞争对手语言(如Scala或Groovy...

StivenYang 7732

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

为什么选择 Java 8

要点速递 在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调优。Lambda 表达式、 Streams API 以及现有类的新方法都是提高生产力的重要工具。Java8 新推出的 Optional 类型在处理 null 值时,能减少 NullPointerExceptions 的可能性,给开发者极大的灵活度。 去年年初,Java8 登场,现在 Java7 便已行将就木。在明年

madison's blog 391

【推荐100个unity插件】基于关节物理控制的自行车、电动车、摩托车模拟解决方案——Simple Bicycle Physics

摘要 "简易自行车物理"是Unity的自行车模拟资源包,支持Animation Rigging,实现基于关节物理的自行车控制。兼容所有平台和渲染管线,包含预制体、材质、脚本等资源。核心脚本Bicycle Controller管理自行车物理属性,支持自定义角色设置和移动端控制。安装后,用户可快速配置骑行场景,调整转向、速度、重心等参数,并支持地面贴合、兔跳等功能。适用于开发各类自行车模拟游戏和应用。 (字数:149)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1365

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

DeepEMD:用可微分推土机距离破解小样本图像分类难题

小样本学习旨在让模型仅凭少量样本完成新类别识别,其核心挑战在于类内差异与形变导致全局特征度量失真。传统方法常将整图压缩为单一向量,丢失关键空间对应关系。最优传输理论中的推土机距离(EMD)通过计算两组局部特征块的最小搬运代价,能够实现结构化、可解释的特征对齐,显著提升对遮挡与姿态变化的鲁棒性。深度网络与可微EMD结合,使匹配权重和距离度量端到端可学习,为细粒度分类、商品识别、医学影像等少样本场景提供了高效的度量学习方案。本文深入解析DeepEMD的匹配原理、实现细节与工程实践要点,帮助读者掌握这一前沿技术并

weixin_34221332的博客 323

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java8 HashMap桶中链表转红黑树为什么选择数字8?

在JDK8及以后的版本中,HashMap引入了红黑树结构,其底层的数据结构变成了数组+链表或数组+红黑树。添加元素时,若桶中链表个数超过8,链表会转换成红黑树。 翻了一下HashMap的源码,发现其源码中有这样一段注释: Because TreeNodes are about twice the size of regular nodes, we use them only when bins ...

qq_33348135的博客 587

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

8年java开发告诉你为什么选择Spring Boot?

Spring是一个非常流行的基于Java的框架,用于构建Web和企业应用程序。与许多其他仅关注一个领域的框架不同,Spring框架提供了广泛的功能,通过其项目组合项目满足现代业务需求。 Spring框架提供了以多种方式配置bean的灵活性,例如XML,Annotations和JavaConfig。随着功能数量的增加,复杂性也会增加,配置Spring应用程序变得繁琐且容易出错。 Spring团队...

weixin_43923408的博客 505

创建Springboot项目时,为什么不能选择Java版本为8

今天在创建springboot项目时,发现选择Java版本怎么不能选择8 后来经过一番的探索,发现了Springboot已经停止对2.几版本的更新与维护了,都是3.几版本 ,而3.几的版本都是以Jdk版本为17或21的,后来发现,修改Server URL 改成阿里云的就没问题,即就是修改springboot的版本为2.几

比时代快才是快,趁风使柁 858

Java重载抛出异常_为什么Java 8类型推理考虑Lambdas在重载选择中抛出的异常?

我有一个关于Java 8推理的问题关于lambdas和他们相关的异常签名。如果我定义一些方法foo:public static void foo(Supplier supplier) {//some logic...}然后我得到了漂亮和简洁的语义能够写foo(() – > getTheT());但在这个例子中,如果我的getTheT操作声明它抛出异常,我的foo方法需要一个Supplier...

weixin_42468245的博客 336
上一篇: 深入浅出 Java 8 Lambda 表达式
下一篇: Java 内存结构备忘录
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值