Java8特性大全(最新版)

春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述Java8特性大全(最新版)相关的知识,希望能为你提供帮助。


一、序言
java8 是一个里程碑式的版本,凭借如下新特性,让人对其赞不绝口。

  • Lambda 表达式给代码构建带来了全新的风格和能力;
  • Steam API 丰富了集合操作,拓展了集合的能力;
  • 新日期时间 API 千呼万唤始出来;
随着对 Java8 新特性理解的深入,会被 Lambda 表达式(包含方法引用)、流式运算的美所迷恋,不由惊叹框架设计的美。
二、方法引用
【Java8特性大全(最新版)】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())
.

    推荐阅读