首页编程java编程java有什么新特性?java的JDK1.8有什么新特性

java有什么新特性?java的JDK1.8有什么新特性

编程之家2023-10-1225次浏览

大家好,今天小编来为大家解答java有什么新特性这个问题,java的JDK1.8有什么新特性很多人还不知道,现在让我们一起来看看吧!

java有什么新特性?java的JDK1.8有什么新特性

java的JDK1.8有什么新特性

Java8(又称为jdk1.8)是Java语言开发迄今为止的一个最主要和用户最多的一个版本。

Java8是Oracle公司于2014年3月18日发布,它不仅支持函数式编程,而且还拥有新的日期API,StreamAPI等操作,下面胖虎带领大家一探究竟Java8的一些新特性。

ava8API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等操作。

java有什么新特性?java的JDK1.8有什么新特性

java8添加了接口的默认方法,简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现的方法。

Java8有哪些新特性

jdk1.8的新特性包括如下:

一、接口的默认方法与静态方法,也就是接口中可以有实现方法

java有什么新特性?java的JDK1.8有什么新特性

二、Lambda表达式

三、函数式接口与静态导入

四、Lambda作用域

在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

五、访问局部变量,等等其他新特性。

Java8新特性有哪些

【注意】本文节选自是 DZone指南 Java生态系统的专题文章,作者Trisha Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java 8的重要特性以及使用的原因,由OneAPM工程师翻译。

一、要点速递

1、在很多情况下,Java8都能提升应用性能,而无需任何改变或性能调优。

2、Lambda表达式、 Streams API以及现有类的新方法都是提高生产力的重要工具。

3、Java8新推出的 Optional类型在处理 null值时,能减少 NullPointerExceptions的可能性,给开发者极大的灵活度。

二、其他特性:

速度更快

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

80%以上的高端企业级应用都使用JAVA平台(电信、银行等)。JAVA是成熟的产品,已经有10年的历史。如果你想在Java行业有所建树,想要系统的进行java的学习,那么你可以来这个群,前面是二三一,中间是三一四,后面是零二八。连起来就可以了。这里有很多互联网大牛教你学习,还有免费的课程。不是想学习的就不要加了。

常见数据结构的性能提升:对广受欢迎的 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之前,你可能会这么做:

privatefinalMap<CustomerId,Customer>customers=newHashMap<>();

publicvoidincrementCustomerOrders(CustomerIdcustomerId){

Customercustomer=customers.get(customerId);

if(customer==null){

customer=newCustomer(customerId);

customers.put(customerId,customer);

}

customer.incrementOrders();

}

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

publicvoidincrementCustomerOrders(CustomerIdcustomerId){

Customercustomer=customers.computeIfAbsent(customerId,

id->newCustomer(id));

customer.incrementOrders();

}

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

publicvoidincrementCustomerOrders(CustomerIdcustomerId){

Customercustomer=customers.computeIfAbsent(customerId,Customer::new);

customer.incrementOrders();

}

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

Streams API

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

publicList<Author>getAllAuthorsAlphabetically(List<Book>books){

List<Author>authors=newArrayList<>();

for(Bookbook:books){

Authorauthor=book.getAuthor();

if(!authors.contains(author)){

authors.add(author);

}

}

Collections.sort(authors,newComparator<Author>(){

publicintcompare(Authoro1,Authoro2){

returno1.getSurname().compareTo(o2.getSurname());

}

});

returnauthors;

}

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

publicList<Author>getAllAuthorsAlphabetically(List<Book>books){

returnbooks.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)的新方法结合使用,可以得到更加简洁的版本:

publicList<Author>getAllAuthorsAlphabetically(List<Book>books){

returnbooks.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:

publicBookfindBookByTitle(List<Book>books,Stringtitle){

Optional<Book>foundBook=books.Streams()

.filter(book->book.getTitle().equals(title))

.findFirst();

returnfoundBook.orElseThrow(()->newBookNotFoundException("Didnotfindbookwithtitle"+title));

}

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

returnfoundBook.orElseGet(()->getRecommendedAlternativeBook(title));

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

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

如果你还想了解更多这方面的信息,记得收藏关注本站。

java装饰模式注意什么?java的装饰者模式中装饰类为什么不直接实现接口金属螳螂(金属螳螂图片)