A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Stream API

延迟方法: (具有延迟执行的特性)

返回值类型"是Stream"类型的方法, 支持链式调用

Stream filter(): 过滤

Stream map(): 映射/转换

Stream limit(): 截取

Stream skip(): 跳过


终结方法:

返回值类型"不是Stream"类型的方法, 不支持链式调用

void forEach(): 遍历

long count(): 统计



注意:
除了终结方法外, 其余方法均为延迟方法

Stream API: filter()过滤

java.util.stream.Stream接口: 管道接口
// 抽象方法
Stream filter(Predicate predicate): 过滤符合条件的结果. 返回过滤后的流

Stream API: map()映射转换
java.util.stream.Stream接口: 管道接口
// 抽象方法
// 抽象方法 Stream map(Function mapper): 将当前流中的T类型的元素, 转换R类型元素, 放入新流 并返回

Stream API: count()统计流中元素个数
java.util.stream.Stream接口: 管道接口
// 抽象方法
long count(): 获取流中的元素个数 (终结方法)


Stream API: limit()获取前n个(只要前n个)
java.util.stream.Stream接口: 管道接口
// 抽象方法
Stream limit(long maxSize): 从流中获取前maxSize个. 如果maxSize大于等于元素个数, 则返回 所有元素的流

Stream API: skip()跳过前n个(不要前n个)
java.util.stream.Stream接口: 管道接口
// 抽象方法
Stream skip(long n): 从流中跳过n个元素, 获取后面的元素. 如果n大于等于元素个数, 则全都跳过


Stream API: 静态方法concat()合并两个流
java.util.stream.Stream接口: 管道接口
// 静态方法
static Stream concat(Stream a, Stream b): 合并两个流 的元素, 变成一个新的流. 两个流中的元素类型必须相同, 或有共同的父类
Stream方法引用

Stream流式思想处理数据的方式:

让代码的执行像流水线一样, 先设计好处理方案, 然后一按开关开始执行

流相比于集合的2个优点:

1. Pipelining(管道特性): "可以链式调用"

Stream流对象的 延迟方法 调用后, 会返回新的Stream流对象, 可以链式调用

每个方法类似于一条一条的管道, 衔接了不同的处理方案

2. 内部迭代特性: "不用写for循环"

集合遍历通过 Iterator 或者 增强for, 显式的在集合外部进行迭代, 这叫做外部迭代

Stream提供了内部迭代的方法 forEach(Consumer c), 可以直接调用遍历方法


使用Stream流的3个步骤:

1. 获取数据源 (从"集合"或"数组"转换为"Stream"对象)

2. 数据处理 (调用延迟方法, 编写处理方案)

3. 获得结果 (调用终结方法, 启动开关)


获取Stream流对象的2种方式:

1. 利用"Collection接口"中的默认方法 default Stream stream() 方法: 集合转Stream对象

2. 利用"Stream接口"中的静态方法 static Stream of(T... values): 数组转Stream对象


java.util.Collection接口:

// 默认方法

default Stream stream(): 将"集合"转换为Stream对象

java.util.stream.Stream接口: 管道接口, 泛型为流中元素的类型

// 静态方法

static Stream of(T... values): 将"数组"转换为Stream对象

收集器

如何理解Stream流:

何理解Stream流: Stream不是集合, 也不是数组, 也不是某种数据结构, 所以Stream内部"不能存储"元素

Stream是一种"函数模型", 规定一些对于集合或数组的处理方案:

在调用"延迟方法"时, 就是在编写处理方案, 但并未真正执行方案

在调用"终结方法"时, 才一次性按照处理方案来操作集合

这也是流式操作"延迟执行"的特点


收集器的作用:

收集Stream操作后的结果, 转换为其他容器

对流操作完成之后, 如果需要将其结果进行收集, 例如转换为对应的"集合"或"数组"等


java.util.stream.Stream接口: 流

Object[] toArray(): 将当前Stream流对象转换为Object[]数组

R collect(Collector collector): 将当前Stream流对象根据传入的 Collector转换为集合或数组



java.util.stream.Collectors类: 收集器静态工具类, 提供不同转换方式的Collector

static Collector> toList(): Stream转List集合

static Collector> toSet(): Stream转Set集合

static <...> Collector<...> toMap(Function keyMapper,

Function valueMapper)

Stream转Map集合.

Function keyMapper: 生成key的转换方式

Function valueMapper: 生成value的转换方式

方法引用

方法引用: Method Reference

如果Lambda表达式仅仅是调用一个已经存在的方法, 那就可以通过方法引用来替代Lambda表达式

作用: 简化Lambda表达式

:: 方法引用运算符, 它所在的表达式被称为方法引用



Lambda表达式写法:

Lambda中, 重写方法的"参数", 必须是方法引用的方法"要接收的类型", 否则会抛出异常

(String s) -> System.out.println(s) 方法有个参数String s

System.out::println 引用的println方法必须能接收String类型的s


注意:

Lambda中, 重写方法的"参数", 必须是方法引用的方法"要接收的类型", 否则会抛出异常


通过类名引用静态方法

类名::静态方法名 Math.abs(1) Math::abs

适用场景:

当Lambda表达式中, 仅仅是"通过某个类名, 调用已有的静态方法"时, 就可以用这种方式简化



方法引用: 通过super引用父类成员方法

通过super引用父类成员方法

super::父类方法名

适用场景

当Lambda表达式中, 仅仅是"在子类中, 调用父类某个已有的方法"时, 就可以用这种方式简化



方法引用: 通过this引用本类成员方法

通过this引用本类成员方法

this::本类方法名

适用场景:

当Lambda表达式中, 仅仅是"调用本类中, 某个已有的方法"时, 就可以用这种方式简化


方法引用: 类的构造方法引用

引用某个类的构造方法

类名::new

使用场景

当Lambda表达式中, 仅仅是"调用某个类的构造方法, 来创建一个对象"时, 就可以用这种方式简化



方法引用: 数组的构造方法引用

引用创建数组的方法

数据类型[]::new

使用场景

当Lambda表达式中, 仅仅是"创建一个数组对象"时, 就可以用这种方式简化







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马