草庐IT

Stream流

wanghycoder 2023-03-28 原文

一、什么叫流

tips:聪明的人只看红字,其他的是我用来解释Stream流的含义

  • Stream不是集合框架,也不是数据结构,他不存储数据,就好比一个工厂,从源头接收原材料,进行加工,然后产出最终产品,在这个过程中,工厂不会存储任何东西。同样的Stream流只会对流数据进行处理并不会保存。流不存储元素它只是通过计算操作管道(或者从计算机的消息队列中)从数据结构、数组或 I/O 通道等源传输元素。
  • 工厂只会对源头接收原材料,并不会把源头的材料给改了,就好比一个生产手机的,源头公司是生产芯片的,他不会把源头公司的芯片变成了主板。同样的Stream流只会接收数据进行处理,并不会改变源数据。流本质上是功能性的
  • 工厂并不是不间断生产,当原材料不足就会被迫停止生产。同样的Stream流并不会主动去寻找数据,如果没有数据流他就停在那里等待,我们叫他惰性,仅在需要时对流进行计算。流是惰性的
  • 当原材料进入工厂,至于怎么加工源头就管不着的,工厂可以按照自己方式进行生产,比如多建立几条流水线,会提高工厂生产效率。同样的Stream流也支持并行处理,如果需要的话,Stream流可以充分利用计算机资源并行处理这段数据。流具有并行处理的能力
  • 当一个原材料被加工成最终产品时,它将无法恢复到原状,即使在强大的工厂也无能为力。同样的Stream流只是一次性的,就像迭代器一样,当对流的处理结束,他将不能再执行一遍。在流的生命周期中,流的元素仅访问一次。

二、流的目的

用于简化集合和数组的操作。

 三、流的使用

List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("柳岩");
list.add("林青霞");
list.add("张曼玉");
//普通写法
//找出“张”开头的人物
list.stream().filter(new Predicate<String>() {
    @Override
    public boolean test(String s) {
        return s.startsWith("张");
    }
}).forEach(s -> System.out.println(s));
//简化写法
//找出“张”开头的人物,并且长度为3的人物
list.stream().filter(s->s.startsWith("a")).filter(s->s.length()==3).forEach(System.out::println);

1. 流的使用流程

数据源(source) -> 数据处理 / 转换(intermedia) -> 结果处理(terminal)

2. Stream的核心思想:

  1. 先得到集合或者数组的Stream流对象。
  2. 把元素放进去
  3. 然后用Stream流简化的API来操作元素

四、流的常用方法

1. 获取Stream流

如果是数组的话,可以使用 Arrays.stream() 或者 Stream.of() 创建流;如果是集合的话,可以直接使用 stream() 方法创建流,因为该方法已经添加到 Collection 接口中。

  • Collection接口中的方法
方法
说明
default Stream<E> stream()
返回以此集合为源的顺序 Stream 。
 
  • 通过数组获取方式,使用Arrays工具类中提供的方法
方法
说明
public static <T> Stream<T> stream(T[] array)
返回以指定数组作为源的顺序 Stream 。
public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive)
返回以指定数组,指定索引范围作为源的顺序 Stream 。
static <T> Stream<T> of​(T t)
返回包含单个元素的Stream
static <T> Stream<T> of​(T... values)
返回其元素为指定值的顺序Stream。
 

 2. 操作流

方法
说明
Stream<T> filter(Predicate<? super T> predicate)
返回由与此给定谓词匹配的此流的元素组成 的流。
Stream<T> limit(long maxSize)
返回由此流的元素组成的流,截断长度不超 过 maxSize
Stream<T> skip(long n)
在丢弃流的第一个 n 元素后,返回由此流 的其余元素组成的流。
Stream<T> distinct()
返回由此流的不同元素(根据 Object.equals(Object) )组成的流。
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
创建一个延迟连接的流,其元素是第一个流 的所有元素,后跟第二个流的所有元素。

3. 终结方法

方法
说明
void forEach(Consumer<? super T> action)
对此流的每个元素执行操作。
long count()
返回此流中元素的数量。
 

有关Stream流的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. ruby-on-rails - 是什么导致了这个 rails ioerror closed stream? - 2

    我有一个Rails应用程序,在开发模式下运行(使用sqlite数据库)。该应用程序的目的是允许用户通过Java客户端上传文件。如果用户要上传一个文件夹,会递归上传里面的所有文件。如果用户要上传文件,文件将正常上传。这是我收到的错误:IOErrorinUploadedFilesController#newclosedstream这是应用程序跟踪:/usr/lib/ruby/1.8/tempfile.rb:167:in`close'/usr/lib/ruby/1.8/tempfile.rb:167:in`callback'/var/lib/gems/1.8/gems/activesuppo

  3. Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读 - 2

    Two-StreamConvolutionalNetworksforActionRecognitioninVideos双流网络论文精读论文:Two-StreamConvolutionalNetworksforActionRecognitioninVideos链接:https://arxiv.org/abs/1406.2199本文是深度学习应用在视频分类领域的开山之作,双流网络的意思就是使用了两个卷积神经网络,一个是SpatialstreamConvNet,一个是TemporalstreamConvNet。此前的研究者在将卷积神经网络直接应用在视频分类中时,效果并不好。作者认为可能是因为卷积神经

  4. ruby-on-rails - cucumber 测试失败,返回 `stream closed (IOError)` - 2

    我们目前正在将我们的Rails应用程序升级到Rails4。在3.2中,我们的Cucumber(1.3.17)测试运行良好(如果可悲地缓慢),使用Capybara(2.4.4)、Poltergeist(1.5.1)和PhantomJS(1.9.8)引擎盖下。但是在4.0.12和4.1.8中,我们在运行中的随机点得到一个streamclosed(IOError):streamclosed(IOError)/var/lib/jenkins/.rvm/gems/ruby-2.1.5@tallama-integration/gems/cucumber-1.3.17/lib/cucumber/fo

  5. ruby - Ruby 中有类似 null-stream 的东西吗? - 2

    我可以使用:File.open('/dev/null','w')在Unix系统上,但如果有Ruby方法来实现这一点,我想使用它。我只是在寻找一个I/O流,它会立即“丢弃”所有写入,有点像空对象。 最佳答案 如果你想要流的完整行为,最好的可能是使用:File.open(File::NULL,"w")请注意File::NULL是Ruby1.9.3的新功能;你可以用我的backportsgem:require'backports/1.9.3/file/null'#=>Won'tdoanythingin1.9.3+File.open(Fil

  6. javascript - 运行 Gulp 会抛出错误 "Cannot find module ' ./lib/_stream_writable.js'” - 2

    我正在构建一个关于Root'sSageWordPressTheme的主题.设置并运行必要的命令后。每当我运行Gulp时,它都会抛出以下错误module.js:338throwerr;^Error:Cannotfindmodule'./lib/_stream_writable.js'atFunction.Module._resolveFilename(module.js:336:15)atFunction.Module._load(module.js:278:25)atModule.require(module.js:365:17)atrequire(module.js:384:17)a

  7. AXI-Stream Data FIFO接口学习 - 2

    1.接口描述AXI-StreamDataFIFO接口与普通的FIFO方案基本差不多,只是写数据端为AXI-stream从接口,读书节端为AXI-stream主接口。2.与普通FIFO的差异相同点:二者都是先入先出,写入多少,读出多少。不同点:AXI-StreamDataFIFO可以通过TLAST信号指示数据节点,同时还可以通过TKEEP和TSTRB信号指示读写数据各个字节的性质和有效性。AXI-StreamDataFIFO的读写端口最少需要TDATA,TVALID,TREADY这三个信号,可选择的添加TKEEP,TLAST,TSTRB信号,本文选择了TKEEP,TLAST信号。单次传输字节数为

  8. javascript - 故障排除错误 : connect ECONNREFUSED in nodejs stream-adventure tutorial - 2

    我一直在学习learnyoujs和stream-adventure教程:https://github.com/substack/stream-adventurehttps://github.com/rvagg/learnyounode#learn-you-the-nodejs-for-much-win我已经完成了第一组,大部分完成了第二组,但我不断遇到奇怪的错误……通常我可以让它消失。这是命令/错误:DEV/javascript/streamAdventure»stream-adventurerunhttpserver.jsstream.js:94thrower;//Unhandled

  9. Java如何借助Stream流进行求和呢? - 2

    转自:Java如何借助Stream流进行求和呢?list简介:  集合就是把具有相同属性的东西放在一起,也可以是容器,把有关的东西都放进去  List是位于java.util下的一个接口,有序集合(也称为序列)  用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素下文笔者讲述Java中使用Stream流对list求和的方法分享,如下所示:实现思路:使用stream中的map,sum方法例:BigDecimal:BigDecimalbb=list.stream().map(User::getScore).reduce(BigDecimal

  10. c - O_NONBLOCK SOCK_STREAM 限制为 8192 - 2

    我正在从C程序写入SOCK_STREAM正在从go程序监听的Unix域套接字,使用net.Listen("unix",sockname).当我将套接字设置为O_NONBLOCK使用fcntl(),我看到C程序在第一次写入时只写入了8192字节。失败后,我监控并回写剩余数据,但我服务器上读取的数据在这种情况下是无效的。当我不使用O_NONBLOCK时,然后整个8762字节被写在一个单一的写入中,一切都按预期工作。C客户端套接字连接if((fd=socket(AF_UNIX,SOCK_STREAM,0))==-1){return;}intflags=fcntl(fd,F_GETFL,0);

随机推荐