Java8特性大全(最新版)
Posted Java知识图谱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8特性大全(最新版)相关的知识,希望对你有一定的参考价值。
一、序言
Java8 是一个里程碑式的版本,凭借如下新特性,让人对其赞不绝口。
- Lambda 表达式给代码构建带来了全新的风格和能力;
- Steam API 丰富了集合操作,拓展了集合的能力;
- 新日期时间 API 千呼万唤始出来;
随着对 Java8 新特性理解的深入,会被 Lambda 表达式(包含方法引用)、流式运算的美所迷恋,不由惊叹框架设计的美。
二、方法引用
Lambda 表达式是匿名函数,可以理解为一段可以用参数传递的代码(代码像数据一样传递)。Lambda 表达式的使用需要有函数式接口的支持。
方法引用是对特殊 Lambda 表达式的一种简化写法,当 Lambda 体中只调用一个方法,此方法满足函数式接口规范,此时可以使用::
方法引用语法。
从语法表现力角度来讲,方法引用 > Lambda表达式 > 匿名内部类
,方法引用是高阶版的 Lambda 表达式,语言表达更为简洁,强烈推荐使用。
方法引用表达式无需显示声明被调用方法的参数,根据上下文自动注入。方法引用能够提高 Lambda 表达式语言的优雅性,代码更加简洁。下面以Comparator
排序为例讲述如何借助方法引用构建优雅的代码。
(一)方法引用与排序
1、普通数据类型
普通数据类型相对较容易理解。
// 正向排序(方法引用)
Stream.of(11, 15, 11, 12).sorted(Integer::compareTo).forEach(System.out::println);
// 正向排序
Stream.of(11, 15, 11, 12).sorted(Comparator.naturalOrder()).forEach(System.out::println);
// 逆向排序
Stream.of(11, 15, 11, 12).sorted(Comparator.reverseOrder()).forEach(System.out::println);
2、对象数据类型
(1)数据完好
数据完好有两重含义,一是对象本身不为空;二是待比较对象的属性值不为空,以此为前提进行排序操作。
// 对集合按照年龄排序(正序排列)
Collections.sort(userList, Comparator.comparingInt(XUser::getAge));
// 对集合按照年龄排序(逆序排列)
Collections.sort(userList, Comparator.comparingInt(XUser::getAge).reversed());
此示例是以Integer
类型展开的,同理Double
类型、Long
类型等数值类型处理方式相同。其中Comparator是排序过程中重要的类。
(2)数据缺失
数据缺失的含义是对象本身为空或者待比较对象属性为空,如果不进行处理,上述排序会出现空指针异常。
最常见的处理方式是通过流式运算中filter
方法,过滤掉空指针数据,然后按照上述策略排序。
userList.stream().filter(e->e.getAge()!=null).collect(Collectors.toList());
3、字符串处理
少数开发者在构建实体类时,String
类型遍地开花,在需要运算或者排序的场景下,String 的缺陷逐渐暴露出来。下面讲述字符串数值
类型排序问题,即不修改数据类型的前提下完成期望的操作。
实体类
public class SUser
private Integer userId;
private String UserName;
// 本应该是Double类型,错误的使用为String类型
private String score;
正序、逆序排序
// 对集合按照年龄排序(正序排列)
Collections.sort(userList, Comparator.comparingDouble(e -> new Double(e.getScore())));
数据类型转换排序时,使用 JDK 内置的 API 并不流畅,推荐使用commons-collection4
包中的排序工具类。了解更多,请移步查看ComparatorUtils。
// 对集合按照年龄排序(逆序排列)
Collections.sort(userList, ComparatorUtils.reversedComparator(Comparator.comparingDouble(e -> new Double(e.getScore()))));
小结:通过以排序为例,实现 Comparator 接口、Lambda 表达式、方法引用三种方式相比较,代码可读性逐步提高。
(二)排序器
内置的排序器可以完成大多数场景的排序需求,当排序需求更加精细化时,适时引入第三方框架是比较好的选择。
1、单列排序
单列排序包含正序和逆序。
// 正序
Comparator<Person> comparator = Comparator.comparing(XUser::getUserName);
// 逆序
Comparator<Person> comparator = Comparator.comparing(XUser::getUserName).reversed();
2、多列排序
多列排序是指当待比较的元素有相等的值时,如何进行下一步排序。
// 默认多列均是正序排序
Comparator<XUser> comparator = Comparator.comparing(XUser::getUserName)
.thenComparing(XUser::getScore);
// 自定义正逆序
Comparator<XUser> comparator = Comparator.comparing(XUser::getUserName,Comparator.reverseOrder())
.Java8新特性