Stream流和方法引用

Stream流:

(对集合跟数组进行一些简化操作,不同于IO流)
JDK1.8之后出现的
特点
(管道流)只能使用一次
第一个Streamz流调用完毕方法,数据就会流向下一个Stream流上,
而这时第一个Stream流已经使用完毕了,就会关闭。
Stream流的流式思想:
当需要对多个数据进行操作(特别是多步操作)的时候,考虑到性能及便利性,
我们应该首先拼好一个“模型”步骤方案,然后再按照方案去执行它。
对事物的方案就是一种“函数模型”

Stream流其实是一个集合元素的函数模型,他并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)

Stream流是一个来自数据源的元素队列
1.元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算
2.数据源:流的来源,可以是集合,数组等

与Collection操作不同,Stream操作还有两个基础的特征
Pipelining:中间的操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格,
这样做可以对操作进行优化,比如延迟执行和短路
内部迭代:以前对集合遍历都是通过Iterator或者增强for的方式,
显式的在集合外进行迭代,这叫外部迭代。Stream提供
了内部迭代方式,流可以直接调用遍历方法。

Stream流的使用步骤:

1.获取一个数据源
2.数据转换(将数据源转换为Stream流)
3.执行操作获取想要的结果(每次转换原有的Stream对象不改变)

获取流:
1.所有的Collection集合都可以通过stream()默认方法获取流(转换集合)
2.Stream接口的静态方法 of 可以获取数组对应的流(转换数组)

Stream流中的常用方法:
静态方法:concate:把两个流组合在一起

延迟方法(返回值类型仍然是Stream接口类型的方法,因此可以链式调用):
Stream filter(Predicate<? super T> predicate);
可以通过filter方法将一个流转换成另一个子集流(过滤)

<R> Stream<R> map(Function<? super T,? extends R> mapper);
如果需要将流中的元素映射到另一个流中,可以使用map方法	

Stream<T> limit(Long maxSize);
对当前流进行截取,返回截取后的流

Stream<T> skip(Long n);
跳过指定的前n个元素,返回截取后的新流
注意:如果指定的n大于原流的元素个数,那么将会得到一个长度为0的空流

终结方法(返回值类型不再是Stream接口自身类型的方法,因此不再支持链式调用):
count、forEach
void forEach(Consumer<? super T> action);
用来遍历流中数据,是一个终结方法,遍历之后不能继续调用Stream流中的其它方法

long count();
用来统计Stream流中的元素个数

方法引用:

1.通过对象名来引用方法:
引用符: ::
优化Lanmda表达式

格式:对象::方法

前提:对象和方法是存在的
注意:Lambda中传递的参数一定是方法引用中的那个方法可以接受的类型,否则会抛出异常

2.通过类名来引用静态方法:
前提:类已经存在,静态方法也已经存在

3.通过super引用成员方法:
如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用替代

4.通过this引用成员方法:
如果存在继承关系,当Lambda中需要出现this调用时,也可以使用方法引用替代

5.类的构造器引用:
格式:构造方法(构造方法已知)::new(创建方式已知)

6.数组的构造器引用:
格式:数据类型[] :: new;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值