一 优点
1.速度更快
举例:HashMap 原来数据结果是数组+链表
原来是map中不允许重复元素,所以会根据对象计算出一个哈希值当作索引并将其放入。若哈希值比较一样,再去equal发现不一样,则在此处形成一个链表,此处称之为碰撞。应该尽可能避免,否则链表中的都得equal一次。减弱方式是哈希方法写的严谨一些,且hash和equal的返回要一样,还有的方式是0.75扩容因子,达到0.75容量则自动扩容,链表上的重新计算哈希重新分配。
新的数据结构是 数组+链表+红黑树
当链表个数超过8及总数超过64,则链表转化为红黑树
2.代码更少
增加了lambda表达式
3.强大的Stream API
4.便于并行
5.最大化减少空指针异常Optional
二 java8新特性和规则
1.lambda表达式
a:结构:lambda表达式和方法一样,提供了参数列表和使用参数的主体,主体可以是表达式或者代码块;当参数为1可以省略(),当主体为一句表达式可以省略{};lambda极其类似于匿名函数,即函数没有返回值权限符方法名;
组成部分:输a:入参数,可执行主体,存放外部参数的空间;lambda表达式访问外部变量时,变量不可变即final(jdk1.8不用显示声明变量final,但其实就是),只是引用不可变
lambda表达式的this是指代外部声明它的对象,而不是表达式产生的那个对象
b:为何使用:越来越方便
演化方式:方法-->设计模式中的接口泛型和实现类->匿名内部类->lambda表达式->stream流
c:lambda需要函数式接口的支持,函数式接口指只有一个抽象方法的接口,可以用@FunctionalInterface修饰,可以检查当前接口是否是函数式接口,举例
@FunctionalInterface public interfaceb: Consumer<T> {
用法:函数式接口声明抽象方法后,用lambda表达式替代具体的实现内容
lambda使用场景:无入参无返回,有入参有返回等交叉场景
d:四大函数式内置接口(方便直接使用lambda表达式),其还有子接口:
Consumer<T>,消费型接口 void accept(T t)
Supplier<T>供给型接口 T get()
Function<T,R>函数型接口 R apply(T t)
Predicate<T>断言型接口 boolean test(T t)
2.Stream流
Stream是java用来处理集合中数据的API,类似于sql中对数据的处理
特点:不是数据结构所以不会存储数据,不会修改数据而会把处理后的数据存入另一个对象,懒加载机制保证只有在执行的时候才会进行数据处理
创建出来的Stream只能被使用一次
流的中间操作:筛选filter/distinct/limit/skip,映射map/flatmap(二者的功能就是进行类型的转换,flatMap可以将所有元素拍平拍扁,然后重新串联起来),排序sorted/sorted(Comparetor),
- peek 挑选 ,将元素挑选出来,可以理解为提前消费
流的终止操作:anymatch/min/max 收集操作collector(Collector.toList/toMap/toSet)
3.@Builder
Java中lombok @Builder注解使用详解 - 云+社区 - 腾讯云
@Buider注解的功能:我们将注解类反编译回来,多了一个静态内部类Builder和一个静态方法builder;从而可以级联设置属性
4.Optional
Java 8 中的 Optional 的优点究竟在哪里? - 知乎
不管你传一个实际值或者空值,都不影响继续下面的操作,不用没回都做判断。这样就可以链式调用一个个函数,所以根本上是为了更方便的组合函数
它看起来只是解决了判空的问题,但是实际上它解决了对象在可能为空时的对象值之间的转换,对目标对象的条件过滤,以及为空时允许的操作,不为空时可以执行的操作
为解决臭名昭著的空指针异常
Optional.empty(): 创建一个空的 Optional 实例
Optional.of(T t):创建一个 Optional 实例,当 t为null时抛出异常
Optional.ofNullable(T t):创建一个 Optional 实例,但当 t为null时不会抛出异常,而是返回一个空的实例
isPresent():判断optional是否为空,如果空则返回false,否则返回true
ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数
orElse(T other):如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值
orElseGet(Supplier<T> other):如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other
orElseThrow(Supplier<X> exception):如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常
map(Function<T, U> mapper):如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。
flatMap(Function< T,Optional<U>> mapper):跟上面一样,在optional不为空的情况下,将对象t映射成另外一个optional
5.方法引用
Java 方法引用是Java 8随着Lambda表达式引入的新特性。可以直接引用已有Java类或对象的方法或构造器。方法引用通常与Lambda表达式结合使用以简化代码。其使用条件是:Lambda 表达式的主体仅包含一个表达式,且 Lambda 表达式只调用了一个已经存在的方法;被引用的方法的参数列表和返回值与 Lambda 表达式的输入输出一致。
不要大肚子,代码提取出来成一个新的方法
6.DateTime API
LocalDate/LocalDateTime/LocalDateTime.parse("2021-01-01 11:11:11 asd",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))/时间的加减乘除等方法
7.guava
谷歌提供的一套为了便于处理java问题的类库。
待学习
8.默认方法
接口提供一个默认实现,且不强制实现类去覆写的方法
允许向接口中添加实现的方法,修饰符必须为default;引入默认方法是为了使用lambda表达式,例如foreach
实现多个接口默认方法冲突:字类覆写,或者super调用指定接口的默认方法
支持接口中定义静态方法,default->static,静态方法必须覆写
9.mapstruct或者beanutils
不同的实体类转换
MapStruct - 一篇就能上手 MapStruct_牧码的博客-优快云博客_mapstruct
10.java实体类命名规则
DTO:请求类型 data transfer object
BO:封装负责的业务对象 business object
PO:映射的数据库的表 persistant object
DAO:主要用来封装对数据库的访问
VO:返回类型 view project
13.学习网站