在处理集合时,我们通常会迭代遍历它的元素,并从每个元素上执行某项操作。例如,假设我们想要对某本书中的所有长单词进行计数。首先我们要将所有单词放入一个列表中:

String contents = new String(Files.readAllBytes(Paths.get("alice.txt")),StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+"));

现在,我们可以迭代它了:

long count = 0;
for(String word : words){
   if(word.length() > 12){
       count++;
  }
}

在使用流时,相同的操作看起来像下面那样:

long count = words.stream()
.filter(word -> word.length() > 12)
.count();

流的版本比循环版本更容易阅读,因为,我们不必要去扫描整个代码去查找过滤和计数操作,方法名称直接告诉我们意欲何为。而且循环需要非常详细地指定操作顺序,而流却能以其想要的任何方式调度这些操作。

仅将stream修改为parallelStream就可以让流库以并行方式来执行过滤和计数。

long count = words.parallelStream();
.filter(w -> w.length() > 12)
            .count();

流操作,遵循了“做什么而非怎么做”的原则。

流和集合之间的区别:

  1. 流不存储其元素,这些元素可能存储在底层集合中,或者是按需生成。

  2. 流操作不会修改其数据源。例如,filter方法,不会从新的流中移除元素,而是会生成一个新的流,其中不包含被过滤掉的元素。

  3. 流操作是尽可能惰性执行的。意味着直至需要其结果时,操作才会执行。例如,我需要查找前5个长单词,而不是所有的长单词,那么filter方法就会匹配到第5个单词之后才会停止过滤。因此我们甚至可以操作无限流。

操作流进程

  1. 创建一个流

  2. 指定初始流转换为其他流的中间操作,可能包含多个步骤。

  3. 应用终止,产生结果。这个操作会强制执行之前的惰性操作。从此之后,这个再也不能用了。

public class CountLongWords {
   public static void main(Stringp[]  args) throws IOException {
    String(Files.readAllBytes(Paths.get("alice.txt")),StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+"));
       
       long count = 0;
       for(String w : words){
           if(w.length() > 12){
               count++;
          }
      }
       System.out.println(count);
       
       count = words.stream().filter(w -> w.length() > 12).count();
       System.out.println(count);
       
       count = words.paralleStream().filter(w -> w.length() > 12).count();
       System.out.println(count);
  }
}

接口介绍:

API:java.util.stream.Stream<T> 8

Steam<T> filter(Predicate<? super T> p)

产生一个流,其中包含当前流中算有的元素。

long count()

产生当前流中元素的数量。这是一个终止操作。

API:java.Collenction<E>1.2

default Stream<E> stream()

default Stream<E> parallelStream()

初探java流操作的更多相关文章

  1. 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)

    写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...

  2. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  3. Java流操作之转换流

    流的操作规律: 1.明确流和目的. 数据源(源头):就是需要读取,可以使用两个体系:InputStream.Reader 数据汇(目的地):就是需要写入,可以使用两个体系:OutputStream.W ...

  4. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  5. Java 字符流操作

    上篇文章Java 字节流操作介绍了java中基本的字节流操作,但是我们常常对于字符操作,如果使用字节流来实现输入输出就显得麻烦,我们可以使用字符流来实现对我们看得见的字符char进行操作,主要内容如下 ...

  6. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  7. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  8. JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律

    JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...

  9. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

随机推荐

  1. Python连载16-reduce函数&filter函数

    一.reduce函数 本函数释义: (1)原意是归并,缩减 (2)把一个可迭代的对象最后归并成一个结果 (3)对于作为参数的函数要求:必须由两个参数,必须返回一个结果 import functools ...

  2. 一步到位安装Centos7、配置VMware、连接Xshell

    1.创建虚拟机 1.0 创建新的虚拟机 1.0.1 选择自定义配置 打开VMware,点击创建新的虚拟机. 如下图所示:   1.0.2 选择虚拟机硬件兼容性 如下图所示:   1.0.3 安装客户操 ...

  3. Hadoop 学习之路(一)—— 分布式文件系统 HDFS

    一.介绍 HDFS (Hadoop Distributed File System)是Hadoop下的分布式文件系统,具有高容错.高吞吐量等特性,可以部署在低成本的硬件上. 二.HDFS 设计原理 2 ...

  4. SSM(一)Mybatis基础

    1.持久化与ORM 持久化是数据在内存与硬盘间相互转化的过程 ORM即对象关系映射 程序员使用面向对象的思维方式处理数据,每个对象都是一个pojo.但是保存数据的时候,却以关系型数据库的方式存储.所以 ...

  5. Mac上使用ssh连接服务器title显示服务器的ip

    Mac上使用ssh连接服务器title显示服务器的ip 使用Mac开发时,管理的服务器过多时,会搞混乱.可能有时啪啪啪一顿操作,最后发现操作错了机器. 解决方案 在远程服务器上,编辑vim /etc/ ...

  6. springboot+redis+Interceptor+自定义annotation实现接口自动幂等

    前言: 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性的 ...

  7. 简单的python多线程实例

    今天抽时间又学了一下python的多线程,理解的又多了一些,为了利于理解,写了一段很简单的代码,如下: import threading from time import sleep def task ...

  8. smobiler介绍(一)

    如果说基于.net的移动开发平台,不得不自我推荐下smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统windows一样去开发移动应用,那么列举一下平 ...

  9. 使用vue-print-nb插件页面空白以及打印没有样式问题

    在使用vue-print-nb中遇到两个问题: 第一个问题:点击打印后,打印的内容是一片空白 vue-print-nb的原理大概是在你的页面上创建一个iframe,然后把你要打印的那一个div抓出来给 ...

  10. 2018.7.16 题解 2018暑假集训之Roads-roads

    题面描述 有标号为1--n的城市与单行道相连.对于每条道路有两个与之相关的参数:道路的长度以及需要支付的费用(用硬币的数量表示) 鲍勃和爱丽丝曾经生活在城市1.在注意到爱丽丝在他们喜欢玩的卡牌游戏中作 ...