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新特性

Java8新特性--Optional

java8 新特性5 方法引用

JAVA8 十大新特性详解

java8新特性

JAVA8新特性