集合框架(2)-什么是stream?

本文介绍了Java中的Streams概念,解释了它们如何作为一系列值处理,并详细说明了流的不同类型及其操作方式。文章探讨了流如何从不同数据源生成,包括数组、集合、生成函数等,并讨论了中间操作与最终操作的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stream是一系列的值。包java.util.stream defines定义了引用值(Stream)的stream类型和一些原语stream类(IntStream,LongStream和DoubleStream)。streams类就像迭代器,它们按处理需求产生元素,但不与任何特定的存储机制关联。stream有时候局部计算-它们中某些元素仍会生成,有时候它的元素会全部参与计算,此时会结束stream。stream可以将数组、集合、生成函数或者一个IO通道作为它的数据源;它也可以是另一个stream的操作结果(见下文)。一种可部分计算流可以有无穷多个元素生成,例如来源于生成函数。

stream类型定义中间的操作(从而产生新的数据流),例如map,和最终操作(导致非流值),如forEach。对中间操作的调用通常以一种流式风格的API链接在一起,形成了一个管道(如前所述)。最终操作,正如它的名字所暗示的,终止方法链。最终操作又被称为“及早操作”,因为调用会导致立即从管道中消费值,而中间操作也叫“懒操作”,只会按需产生值。例如,假设strings被声明为List<String>,代码:
     IntStream ints = strings.stream().mapToInt(s -> s.length()).filter(i -> i%2 != 0);


启动一个管道,首先生成一个相应于字符串值长度int值的stream,然后仅在奇数时通过。但是对于声明为ints的结果来说什么也没发生。当有像这样的语句时才发生处理
ints.forEach(System.out::println);

使用一个及早最终操作来将管道中的值取出。
下表显示了流操作的一个小示例。为简单起见选择了这些例子,出于同样的原因,方法签名中的有界泛型类被替换成了其界类型。

[img]http://dl2.iteye.com/upload/attachment/0092/9759/082869d4-de08-3f25-b8ad-992fe907f9eb.jpg[/img]

streams可以是有序或者无序的。stream的来源是数组、链表或者生成函数是有序的,来源是集合是无序的。顺序是由最中间操作保存;异常进行排序,其中规定了先前存在是有序的还是无序,从而消除了存在于接收器的任何顺序。在有些情况下会提供这种操作:最终操作的顺序不明显但开发者想更高效的利用这些操作,其在某些无序的stream上并行操作比串行操作更高效。大多数最终操作遵循顺序;例如toArray,被称为一个有序流,按元素顺序创建一个数组。forEach是个例外;其流中元素处理的顺序是不定的。

原文链接:http://www.lambdafaq.org/what-is-a-stream/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值