java8新特性

一 优点

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 8 的方法引用吗 - 知乎

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_牧码的博客-CSDN博客_mapstruct

10.java实体类命名规则

DTO:请求类型 data transfer object

BO:封装负责的业务对象 business object

PO:映射的数据库的表 persistant object

DAO:主要用来封装对数据库的访问

VO:返回类型 view project

13.学习网站

Gitee - 基于 Git 的代码托管和研发协作平台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值