春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述Java8特性大全(最新版)相关的知识,希望能为你提供帮助。
一、序言
java8 是一个里程碑式的版本,凭借如下新特性,让人对其赞不绝口。
- Lambda 表达式给代码构建带来了全新的风格和能力;
- Steam API 丰富了集合操作,拓展了集合的能力;
- 新日期时间 API 千呼万唤始出来;
二、方法引用
【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())
.推荐阅读
- 升级GCC,支持C++17
- 小白用c语言编写七大排序(上)方法(?为了让和笔者一样的小白能看懂,笔者注释了很多))
- Redis哨兵模式部署
- zabbix5.0自定义web监控
- SpringBoot中的Schedule定时任务#yyds干货盘点#
- webterminal开源堡垒机
- #yyds干货盘点#为了完成小姐姐安排的打分系统,又熬了一个小时的夜补充视图与模板
- 用 3000 字告诉大家,我们为什么要学习 Springboot()
- #yyds干货盘点# C#+Access+asp.net教学计划管理系统