https://juejin.im/post/5cd97ccb518825686b1209ea
https://www.jianshu.com/p/15c90dacf134
1、lambda表达式
在Java8中引入了一个新的操作符“->”,该操作符称为箭头操作符或Lambda操作符,左侧:Lambda表示式的参数列表,右侧:Lambda表达式中所要执行的功能,即把函数作为一个方法的参数,通常多用于匿名内部类的简洁写法,同时lambda表达式也是更好的使用StreamAPI的基础。
变量作用域:lambda 表达式只能引用 final 或 final 局部变量,这就是说不能在 lambda 内部修改定义在域外的变量,否则会编译错误。
2、函数式接口
Lambda的设计者们为了让现有的功能与Lambda表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念。
函数式接口(Functional Interface)就是只具有一个抽象方法的普通接口。
在实践中,函数式接口非常脆弱:只要某个开发者在该接口中添加一个函数,则该接口就不再是函数式接口进而导致编译失败。为了克服这种代码层面的脆弱性,并显式说明某个接口是函数式接口,Java 8 提供了一个特殊的注解@FunctionalInterface
@FunctionalInterface
public interface Functional{
void method();
}
需要注意,默认方法和静态方法不会破坏函数式接口的定义。
3、默认方法和静态方法
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个default关键字即可实现默认方法。
4、方法引用
方法引用是lambda表达式的一种特殊形式,如果正好有某个方法满足一个lambda表达式的形式,那就可以将这个lambda表达式用方法引用的方式表示,但是如果这个lambda表达式的比较复杂就不能用方法引用进行替换。实际上方法引用是lambda表达式的一种语法糖。方法引用的实质就是使用更简单的方式代替Lambda表达式。
在介绍方法引用使用方式之前,先将方法引用分下类
方法引用共分为四类:
1.类名::静态方法名
2.对象::实例方法名
3.类名::实例方法名
4.类名::new
5、Stream API
可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了!
Stream使用方法:
创建Stream:一个数据源(集合、数组)获取一个流
中间操作:一个中间操作链,对数据源的数据进行处理
终止操作:一个终止操作,执行中间操作链,并产生结果。
6、LocalDateTime
LocalDateTime是一个不可变的日期时间对象,代表日期时间,通常被视为年 - 月 - 日 - 时 - 分 - 秒。这个也是在开发中使用的最多的,例如统计数据的时候根据时间分组后,统计当前季度或者下一季度的,或者获取当前年月,再例如获取当前月的第一天,当前月的最后的一天,下两个月的最后一天等等,使用LocalDateTime都可以很简单的完成。
7、Optional
这个也可以说是一大神器啦,排除空指针异常呀,有时候自己写的你还能注意点盼空,随着微服务的使用,调用其他系统接口,你也不完全知道别人会给你返回个人什么呀,之前我们可以使用三木运算判空或者if判空,现在可以使用Optional更加优雅的消除空指针。
8、Base64
这个虽然没有之前的新特性用的多,但是在最近的项目开发中使用带了,就顺便记录一下吧
String text = "show me the code";
String encoded = Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
String decoded = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);