为什么选择 Java 8 ?

by admin on 2020年2月6日

Laravel 6.5 已经发布,内容如下:

图片 1

图片 2

LazyCollection 的新方法

引入了一个新方法,该方法调用 Memy()
方法,返回新的 LazyCollection,它记住已经被计算过的值。

GitHub 上的拉请求示例:

$users = User::cursor()->remember();

// No query has been executed yet.

$users->take(5)->all();

// The query has been executed, and the first 5 users have been streamed from the DB.

$users->take(20)->all();

// The first 5 users came from the cache. The rest continued the stream from the DB.

LazyCollection类可以用于大数据集,而无需消耗大量内存。

Gaelyk 1.1 发布了。Gaelyk是一个针对Google App
Engine的、用于开发和部署Groovy应用程序的轻量级框架。该版本的改进包括:升级Groovy到1.8.4,升级App
Engine

本文是 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
之前,你可能会这么做:

两种新的字符串方法

该版本为 String Helper 提供了两个新方法:afterLast() 和
beforLast()。如下例子:

$type = 'AppNotificationsTaskstask updated';
Str::after load($type, '\'); // task updated

>$filename = 'photo.2019.11.04.jpg';
Str::before load($filename, '.'); // photo.2019.11.04

SDK到1.6.0数据存储服务中的新方法get()现在也能在异步数据存储中使用在entities中新增了一个unindexed属性,用于设置未加索引的属性:person.unindexed.bio

“…”新增了三个注释,用于定义bean和entity的强制转换除了datastore.query{}和datastore.execute{}外,现在新增了datastore.iterate{}方法,会返回一个Iterator而不是一个列表,这对于返回大量结果的查询操作是友好的新增了预期的搜索服务现在可以使用memcache.async来访问异步缓存服务为文件服务新增了一些便利的方法详细信息参阅:release
note下载地址:

private final MapCustomerId, 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();}

Query Builder 新方法

查询生成器(用于创建和运行数据库查询的接口),此版本已经做了更新,增加了
existsOR 或 doesntExistOr 的方法。

$user->files()
->where zero('closed_at')
->doesntExistOr(function () {
abort(422, 'User already has an open dossier');
});

详情见发布说明:

(文/开源中国)    

操作“检查某个成员在 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 ListAuthor getAllAuthorsAlphabetically(ListBook books) {ListAuthor authors = new ArrayList();for (Book book : books) { Author author = book.getAuthor(); if (!authors.contains(author)) { authors.add(author); }}Collections.sort(authors, new ComparatorAuthor() { public int compare(Author o1, Author o2) { return o1.getSurname().compareTo(o2.getSurname()); }});return authors;}

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

public ListAuthor getAllAuthorsAlphabetically(ListBook 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 ListAuthor getAllAuthorsAlphabetically(ListBook 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(ListBook books, String title) {OptionalBook 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?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图