阅读更多

7顶
2踩

编程语言

转载新闻 为什么选择 Java 8 ?

2015-11-04 15:18 by 副主编 mengyidan1988 评论(4) 有8719人浏览
【编者按】本文是 DZone 指南 Java 生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由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 对业务、现有的应用以及期望提高生产力的开发者都好好多。

原文链接:Why Java 8?
  • 大小: 27.7 KB
来自: OneAPM
7
2
评论 共 4 条 请登录后发表评论
4 楼 墨菲托斯 2015-11-17 14:14
                   
[align=left]
[/align]
3 楼 somefuture 2015-11-04 16:12
必须改过来啊,早就开始用8了
2 楼 dsjt 2015-11-04 16:09
垃圾回收改变很大呀

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Java8-为什么选择java8

    Java的演变过程 Java从头到尾都是被设计成为一门面向对象的语言,所以时间长了,它就积累了很多的有用的库。从头开始,他就拥有多线程处理的能力。最重要的是Java里面有两个非常强大非常超前的两个概念:jvm和Java...

  • YDOOK:SpringBoot: Java 版本选择 java1.8(java8)还是 java11?

    YDOOK:SpringBoot: Java 版本选择 java1.8(java8)还是 java11? © YDOOK JY Lin 文章目录 YDOOK:SpringBoot: Java 版本选择 java1.8(java8)还是 java11? © YDOOK JY Lin 1. java 1.8 与 java11 的区别: 1. ...

  • Java学习路线总结,搬砖工逆袭Java架构师

    定期分享Java硬核技术干货、分享Java学习路线、分享Java经典面试题

  • IDEA不支持Java8了怎么办?

    IDEA不支持Java8了怎么办? 01 异常发生场景 当我准备创建一个springboot项目时,发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后,确认了是Spring Boot 不再支持 Java 8,不是我的问题,这一天终于还是...

  • JAVA 8与JAVA 11到底该怎么选?

    JAVA 8与JAVA 11到底该怎么选? 很多初学Java的小伙伴经常咨询: 到底该安装哪个版本的JDK比较好? Java 8到底还够不够用? Java 11究竟有什么改进? 是不是Java版本越新越好? …… 是这样,官网现在其实都已经...

  • 【Java基础知识 1】Java入门级概述

    CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。

  • Java 8 List 排序

    Java 8 对 List排序

  • 为什么大部分程序员还在用Java 8?

    尽管 Java 升级换代,但于开发者来说,还是紧紧地抱着 Java 8 不放,这是为什么呢?一起来看下吧。 以下为译文: 近日的调查结果显示,绝大多数开发人员的主要应用程序中使用的还是 Java 8。 数据来源:...

  • java三大平台介绍,选择哪个平台学习java编程?

    java三大平台介绍,该选择哪个平台学习java编程?如何搭建自己的第一个程序

  • java属于什么语言_java是什么语言 ?是什么系统?

    一开始了解计算机这个专业,大家都会经常性听到Java这一词语,那么大家有真正的了解什么是Java吗?Java是属于什么语言呢?JAVA语言,其实是混合型的一种语言,Java语言是一个支持网络计算的面向对象程序设计语言。Java...

  • Java为啥比PHP快?

    java 真的比php快吗,快又快在哪里,php有优化的方案吗?,php 8.0 jit有实际意义吗?

  • java语言有什么特点?

    Java语言共有十大特点,分别为:简单性、面向对象、分布性、编译和解释性、稳健性、安全性、可移植性、高性能、多线索性、动态性。 1、简单性:Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、...

  • Java 泛型,你了解类型擦除吗?

    大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的...

  • apt安装JDK8并设置为系统默认Java

    最近重装系统,新系统自带JDK11,但是我的项目使用的是JDK8,去网上搜索看很多安装方法都是下载安装包然后解压安装,个人感觉这种方法太不方便了,我们优apt工具为什么不直接用apt工具安装呢? 这里是一段防爬虫文本,...

  • 如何查看是否安装了java环境?

    如何查看是否安装了java环境?

  • java8 (一):为神马要学习java8?

    1. java8新特性 1.1 新特性介绍: 简而言之,java8的新特性就是:Lamdba函数(匿名函数),流,默认方法。 Java8 的灵活使用,会使得代码可读性更好(前提是你的同事也使用,别人不会,你强行使用,会被喷的!!!)...

  • Java打印输出:java在线8x8x

    Java打印输出数据println和print打印输出数据,System.out.println("java在线8x8x");av在线8x8x System.out.println("java在线8x8x");java在线8x8x System.out.println("java在线");//java在线

  • golang和java,到底如何选择?

    我认为Java还会是企业级服务软件以及大数据方向的首选,生态很完善和强大,不光是阿里美团这样大厂的支持和布道,对小公司也可以依靠Java完善的生态,快速搭建起自己的系统推向市场。 尽管oracle一直在作死,还是有...

  • Java 答疑:为什么修改 Java 环境变量之后 java -version 不变?解决方式汇总

    更新了 JDK 的版本,环境变量也进行了修改,为什么在命令界面输入 java -version 还是显示之前旧版本 JDK 的版本信息呢?可能有人在安装/更新 JDK 时遇到了这样的疑惑,这是什么原因导致的呢?网上的相关攻略找来找...

  • 今年还能学java么?

    Java很卷”、“大家不要再卷Java了”,经常听到同学这样抱怨。但同时,Java的高薪也在吸引越来越多的同学。不少同学开始疑惑:既然Java这么卷,还值得我入行吗?!理由我们往下慢慢看。Java卷是客观事实但也带来好的...

Global site tag (gtag.js) - Google Analytics