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

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. MyBatis从入门到精通(二):MyBatis XML方式的基本用法之Select

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 明确需求 书中提到的需求是一个基 ...

  2. Linux基础及系统优化

    1 如何实现自动挂载操作(光驱自动挂载--fstab) 1.1 方法 第一种方法:编辑fstab文件 vi /etc/fstab /dev/cdrom /mnt iso9660 default 0 0 ...

  3. MySQL字符集乱码详解

    对于MySQL数据库中出现乱码经常是新手碰到的一个头痛的问题,不知道为什么经常出现中文乱码. 1.对于所谓的数据库中乱码,其实这中说法是错误的,只是我们不认识服务器给我们的字符.其实还是原来的字符?那 ...

  4. 学习 GitHub 有什么好处?

    layout: post title: "学习 GitHub 有什么好处?" date: 2018-04-15 19:20:20 +0800 --- 鸣谢:王顶 老师(河北经贸大学 ...

  5. Kafka集群部署指南

    一.前言 1.Kafka简介 Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台.Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka ...

  6. core文件生成和路径设置

    在程序崩溃时,内核会生成一个core文件,即程序最后崩溃时的内存映像,和程序调试信息. 之后可以通过gdb,打开core文件察看程序崩溃时的堆栈信息,可以找出程序出错的代码所在文件和函数. 1.cor ...

  7. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  8. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库

    1. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库 请求参数实体定义: FluentValidation 验证类定义: 过滤器:ActionFilter中O ...

  9. P2344 奶牛抗议 离散化+前缀和+动态规划+树状数组

    [题目背景] Generic Cow Protests, 2011 Feb [题目描述] 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正 ...

  10. jira设置问题关闭之后不能继续编辑和添加备注

    设置工作流中的Closed步骤的工作流属性值,增加两个: jira.permission.comment.user:(空) jira.issue.editable:false Closed这个步骤之后 ...