jdk1.8新特性 lambda表达式 stream流

为什么使用lambda表达式

lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。

Java8 内置四大核心函数式接口

Consumer : 消费型接口

​ void accept(T t);

Supplier : 供给型接口

T get();

Function<T,R> : 函数型接口

R apply(T t);

Predicate : 断言型接口

boolean test(T t);

方法引用

若lambda体中的内容有方法已经实现了,我们可以使用“方法引用”(可以理解方法引用是lambda表达式的另一种表现形式)

主要有三种语法格式:

对象::实例方法名

类::静态方法名

类::实例方法名

注:当lambda能被方法引用替代时,idea编译器会有提示。

Stream API

流到底是什么?

流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算”。

注意:

  1. stream自己不会存储元素

  2. stream不会改变源对象,相反它们会返回一个持有结果的新stream

  3. stream操作是延迟执行的,这意味着它们会等到需要结果的时候才执行

操作流的步骤

Stream的三个操作步骤:

  1. 创建Stream
  2. 中间操作
  3. 终止操作(终端操作)

创建Stream的方式:

  1. Collection系列集合的stream()或parallelStream()
  2. Arrays中的静态方法stream()获取数组流
  3. 通过Stream类中的静态方法of()
  4. 创建无限流:Stream stream = Stream.iterate(0,x->x+2); //从0开始无限加2

中间操作

举例:

filter

limit

skip(n) :扔掉前n个元素

distinct :筛选去重 类对象需要重写hashcode和equals方法才能生效

map:接收lambda。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

sorted( Comparator comparator ):排序

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理。而在终止操作时一次性全部处理,称为“惰性求值”。

终止操作(终端操作)

allMatch(Predicate<? super T> predicate) 集合元素全匹配 返回boolean

anyMatch(Predicate<? super T> predicate) 集合元素任意一个匹配 返回boolean

noneMatch(Predicate<? super T> predicate) 集合元素不匹配 返回boolean

findFirst() 返回集合中第一个元素

findAny() 并行流返回集合中任意一个元素,串行流返回第一个元素

count() 返回集合大小

max(Comparator<? super T> comparator) 返回最大元素

min(Comparator<? super T> comparator) 返回最小元素

collect(Collector<? super T, A, R> collector) 接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

串行流与并行流

概念

顾名思义串行流就是串行执行的流,并行流就是并行执行的流。

并行流就是把内容分割成多个数据块,每个数据块对应一个流,然后用多个线程分别处理每个数据块中的流。底层由Fork/Join框架提供线程池实现并行处理。

效率

并非并行流效率一定高,例如:数组易拆分成多块执行,而链表就很难拆分。且并行流意味着会占用更多的内存,所以应该酌情使用。

Optional

定义

Optional 类 (java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在用 Optional 可以更好的表达这个概念;并且可以避免空指针异常

常用方法:

Optional.of(T t):创建一个 Optional 实例
Optional.empty(T t):创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则空实例
isPresent():判断是否包含某值
orElse(T t):如果调用对象包含值,返回该值,否则返回 t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f):如果有值对其处理,并返回处理后的 Optional,否则返回 Optional.empty()
flatmap(Function mapper):与 map 相似,要求返回值必须是 Optional

猜你喜欢

转载自blog.csdn.net/GBS20200720/article/details/121188902