你最应该尝试的8个java8新特性

java8早在2014年就已经发布了,但时至今日,相信很多公司的不少应用仍然运行在java6上。如今,java的版本更新会保持半年发布一个新版本,作为一个主要使用java编程的用户,我还是非常高兴能够看到java变得越来越好。

java8发布了很多革命性的新特征,可以在很大程度上提高生产力,因此我们有必要好好学习一下。

下图是我根据官方文档整理的java8中核心的新特性:

如上图所示,升级主要可以分为类库扩充、语法更新、命令行工具以及JVM四大方面。细数起来,java8的升级点还是非常多的,但是若想快速上手,享受到java8带来的新体验,也非常容易,本文就尝试梳理能让我们立竿见影的看到效果的8个java8新特性。

1. lambda表达式

之所以把这个放在第一位,是因为这是java首次引入函数式编程特性,使代码书写更简洁、更高效。这也是java8中最引入注目的地方。

废话不多说,我们来实际体验一下吧:

上面代码中,遍历列表并进行一些操作只需要一行代码,不用再写for循环了。其中就是一个lambda表示式,它等价于下面的方法:

lambda最大的好处就是可以使用一个匿名函数来表达一段简单的逻辑,使代码更简洁。

2. 流式编程

流式编程是一种更加抽象的编程范式。

在以往,如果要对一批数据进行处理,我们通常需要逐个进行处理,在循环中写好对每个元素的处理逻辑。使用流式编程,我们只需要将一个数据集合作为数据流,然后声明对该数据流做哪些处理,例如过滤、映射等,程序即可帮我们完成所指定的任务。而且利用流式编程,可以更自然的利用多核进行并行处理,提高效率。

看代码:

该程序将统计numbers列表中小于3的数字个数,并打印出统计结果。一行搞定,如果采用遍历的方式,没有个三五行恐怕是不行的。

大家应该也注意到了,流式编程通常和lambda一起使用。

方法将集合变为流式对象,之后我们就可以在流上声明我们需要的操作,常用的有:

filter: 过滤,传入一个返回值是true/flase的函数,则可以根据条件,将表示式为true的项找出来

map: 映射,将流中的每一个元素做一次变换,映射为一个新的元素

count: 计数

3. Optional类

Optional最初是Google在java工具类guava中推出的,目的是为了能够更优雅的处理,java8借鉴了guava的思想。

在java程序中,我们要非常小心的使用通过参数传入进来,或者调用方法返回的对象,需要对他们判断是否为,如果不判断直接使用就有可能抛出。

Optional对java对象进行了一层封装,针对对象是否为空,可以采用不同的处理方式,使我们的程序更优雅,可读性更好。

如上面代码所示,我们不再亲自去判断name是否为null,直接把它放到Optional中,之后调用方法,方法需要传入一个函数或者lambda表达式,一旦Optional中的对象不为空,则对该对象应用这个函数。

方法则在对象为null时用其他值替代返回值,这个也是我们常常使用的。

如果不用Optional,代码将会是这样:

4. 增强的类型推断

泛型是我们经常会使用到的,它可以增强代码的灵活性,但是在java8之前,代码需要这样写:

现在,你只需要这样写:

jvm会对后面一个泛型自动推断出类型,这样我们的代码会更简洁。

5. 并行数组

java8中对类进行了增强,支持对数组处理使使用多核并行计算。具体来说,就是增加了一系列开头的方法,例如,等。

6. 全新的日期/时间API

在java8以前,日期、时间API存在以下问题:

不统一:java.util和java.sql中都有日期类

混乱:java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,用于日期格式化的类却在java.text包中

线程不安全:所有的日期类都是可变的

新的java8将完全解决这些问题,引入了一个全新的包java.time,在设计上具有如下优点:

不变性:所有的日期/时间类都是不可变的,因此也是线程安全的

职责分离: 日期、时间、日期时间、时间戳、时区分别有不同的类来处理

易于使用:所有的时间/日期类都有format方法和parse方法用于格式化处理,并提供的日期的加、减运算方法

7. 接口的默认方法和静态方法

在java8之前,接口中的所有方法默认都是的,所有方法都没有具体实现,留给子类去实现。

但在java8中,接口变得更强大了,其中可以包含方法和方法,方法用于定义那些所有子类都公用的默认逻辑,方法定义那些与实例无关的接口级别的方法。有了这两者,接口将更加的高效。

运行结果如下:

在接口中,方法是用来解释飞行这个动作的,是与具体实例无关的,因此被定义为一个静态方法,而和则是每次飞行都默认的行为,因此是默认方法,方法则是每种不同的事物飞行所不同的,留给子类实现。是一种可以飞的动物,它实现了接口,并定义了鸟类的飞行。

8. 方法引用

方法引用是随着java8中引入函数式编程而来的,对于函数式编程来说,允许将函数作为参数来传递。在java8中,将允许我们引用一个类或对象的方法作为参数来实现函数式编程。

一个最简单的方法引用的例子如下:

其中就是在引用方法。

小结

以上就是本人强烈推荐大家尝试使用的java8中的8个新特性:

通过使用函数式编程(方法引用、lanmbda表达式、流式计算)我们可以大大简化代码书写,提高开发效率;

通过并行数组,可以利用多核计算来提高运行效率;

通过使用Optional类可以更优雅的处理null值判断与相关操作;

通过使用增强类型判断,简化泛型使用;

通过使用新的类库如java.time包中日期/时间类,更方便安全的处理时间问题;

通过更强大的接口(默认方法、静态方法)实现更好的复用

这些特性都非常简单,却可以给我们带来实实在在的好处,快用起来吧!

参考资料

Oracle: What's New in JDK 8

ImportNew: Java8 lambda表达式10个示例

ImportNew:Java8 日期/时间(Date Time)API指南

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180130G0KGNX00?refer=cp_1026

相关快讯

扫码关注云+社区