JAVA8新特性-lambda表达式的使用

发布时间 2023-07-03 17:47:00作者: LBC_0612

Java1.0-java16.0版本

有两个大版本:java5  加入了并发包,JUC(java.util.concurrent)   concurrentMap 1.5以后的

                         java8加入了lambda表达式,接口新特性,日期新特性,可选项 。。。

lambda表达式:

注意:如果我们自定义的这种接口,只有一个抽象方法的接口才可以使用lambda表达式,因此这种接口我们称之为函数式接口,我们可以使用函数式注解@FunctionalInterface表示接口为函数式接口

java也为我们提供了几种函数式接口,在rt.jar包下,java.util.function包下

这些接口我们可以归结为四大类:

Consumer:消费型接口  ------ 这种接口就是我给你值,你去消费就可以了,像打印,保存数据等

Supplier:供给型接口  ----- 这种接口就是接口给我们值,提供给我们值,我们来消费

Predicate:断言型接口  ----- 我们来判断这个参数是正确的还是错误的,比如参数不符合要求,逻辑是错的

Function:函数型接口  -----  这种接口就是我给你参数,你给我返回值

提示:静态方法是类名 调用  类名::方法名  构造方法:类名 ::new   普通方法:对象变量名::方法名

          当我们想写的表达式逻辑,和返回值与已经存在的某一个类的方法一摸一样,那么就不用再写一遍了

关于方法的引用:

构造函数的引用:

 lambda表达式的流式操作(Stream接口):

Collection(集合)的获取:可以通过 Collection.stream() 或者 Collection.parallelStream() 来创建一个Stream

Map的获取:不能直接获取Stream类型:1、keySet().stream();2、values().stream();3、entrySet().stream()

3、数组的获取:Stream中的of方法,Stream.of(数组)

Stream中的常用方法:

1、终结方法:调用完成之后,返回值不再是Stream类型本身,无法继续调用Stream中的方法,例如:forEach、count,collect

2、延迟方法:调用完成之后,返回值还是Stream类型,可以继续调用Stream中的各种方法;除了终结方法,全都是延迟方法

例如:Stream<T>  filter(Predicate<? super T> pre): 根据pre描述的判断条件,对流中的数据进行过滤

          Stream<T>  limit(long maxSize):根据参数maxSize描述的个数,对流中的数据进行截取

 

Stream<T>  skip(long n):跳过参数n描述的个数,流中剩余的是n之后的内容

Stream<R>  map(Function<? super T, R> fun ):将流中的所有T类型数据,都根据fun这个函数型接口,转换成其他的R类型数据

forEach(Consumer<? super T>  con):将流中的数据,根据con描述的处理方式,进行处理

long count():返回流中的元素数

 

 

补充:java8其他新特性

Optional类:避免空指针的

Optional.of():要求放入的对象不为null

Optional.ofNullable():Optional<String> op = Optional.ofNullable(str); String s = op.orElseGet(() -> "默认值"); //如果有值,直接获取,如果值为null,那就可以获取默认值