Lambda表达式
jdk8之前,启动一个线程代码
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("123");
}
}).start();
jdk8后
new Thread(()-> System.out.println("123")).start();
Lambda表达式也可称为闭包。本质上是一个匿名方法,允许把函数作为一个方法的参数,或者把代码看成数据。使用Lambda表达式可以使代码变的更加的简洁紧凑。
怎么使现有的函数支持Lambda?
增加函数式接口(就是接口里面必须有且只有一个抽象方法的普通接口,这样的接口可以 被隐式转换为Lambda表达式称为函数式接口)
@FunctionalInterface
public interface Runnable {
// 抽象方法的普通接口
public abstract void run();
}
@FunctionalInterface标明是函数式接口
接口的默认方法和静态方法
默认方法
默认方法与抽象方法不同之处在于:抽象方法必须要求实现,默认方法没有此要求(接口可以实现此方法,而且不需要实现类去实现)。
加上default关键字即可实现默认接口
public default void show1(){
System.out.println("show1");
}
好处:当需要修改接口的时候,需要修改全部的接口实现类。引入默认方法,就是为了解决接口的修改与现有的实现不兼容的问题。
静态方法
使用static关键字进行修饰,只能通过接口名进行调用
public static void show2() {
System.out.println("show2");
}
新的日期API
旧的日期API Date是非线程安全的,并不支持国际化
LocalDate(无时区)和ZonedDate(有时区)
Base64
内置了Base64的编码和解码功能
Optional
Optional类实际上是一个存放对象的容器,很好的解决了空指针异常,这样我们就不用显示进行空值检测。
提供了创建对象的方法,ofNullable(),接受一个可以为null的对象。如果为null,创建空实例;否则,创建实例。
Optional<String> nullableOpt = Optional.ofNullable(str);
方法引用
可以直接引用已有java类或对象的方法或构造器
- 构造器方法引用(格式:Class::new,调用默认构造器)
- 类静态方法引用(格式:Class::static_method)
- 类普通方法引用(格式:Class::method,方法不能带参数)
- 实例方法引用(格式:instance::method)
https://blog.csdn.net/youanyyou/article/details/78993015
注解特性
重复注解
可以使用同一个注解去多次注解。
jdk8以前是通过注解容器去实现
public @interface Authority {
String role();
}
public @interface Authorities { //@Authorities注解作为可以存储多个@Authority注解的容器
Authority[] value();
}
public class RepeatAnnotationUseOldVersion {
@Authorities({@Authority(role="Admin"), @Authority(role="Manager")})
public void doSomeThing(){
}
}
jdk8后新增了重复注解
@Repeatable(Authorities.class)
public @interface Authority {
String role();
}
public @interface Authorities {
Authority[] value();
}
public class RepeatAnnotationUseNewVersion {
@Authority(role="Admin")
@Authority(role="Manager")
public void doSomeThing(){ }
}
创建重复注解Authority时,加上@Repeatable,指向存储注解容器Authorities(仍然需要定义注解容器,只是一种使用简化)
类型注解
jdk8以前,注解只能用于程序元素(类、接口、方法、成员变量)
jdk8后,注解可以用在任何使用到类型的地方
TYPE_PARAMETER:表示该注解能写在类型参数的声明语句中。 类型参数声明如: <T>、<T extends Person>
TYPE_USE:表示注解可以再任何用到类型的地方使用,比如允许在如下位置使用:
- 创建对象(用 new 关键字创建)
- 类型转换
- 使用 implements 实现接口
- 使用 throws 声明抛出异常
String str = (@NotNull String) obj;
无处不在的注解,可以让编译器执行更严格的代码检查,从而提高程序的健壮性。
https://blog.csdn.net/liupeifeng3514/article/details/80722003
并行数组
数组排序,jdk8以前,Arrays.sort(); jdk8以后,Arrays.parallelSort();并行排序
增加了很多方法支持并行的数组处理
并发
增加了一些并发的类
Stream
Stream API极大简化了集合框架的处理,将要处理的集合元素看做流,流在管道中运输,并且可以在管道的节点上进行处理,比如筛选、排序、聚合等
它不是一种数据结构,不保存数据,只是在原数据集上定义了一组操作,并且只有在访问到具体的元素,采用执行操作。
按操作过程分为:
中间操作:返回结构都是流
最终操作:返回需要的数据
原文