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指南
领取专属 10元无门槛券
私享最新 技术干货