Java8 Stream

概述

Java8 API中添加了一个新的抽象成为流Stream,可以以一种声明的方式处理数据。

Stream与java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是对集合对象功能的增强,专注与对集合对象进行各种非常便利、高效的聚合操作,或大批量数据操作。

Stream就像一个高级版本的迭代器,用户只要给出需要对其包含的元素是执行什么操作,Stream会在内部隐式进行遍历,做出相应的数据转换。

Stream和迭代器又有不同,Stream可以并行操作,即将数据分为多段,其中每一个都在不同的线程中处理,然后将结果一起输出。

先看下面一个例子:

Java8 Stream

 

通过这个例子,可以看出引入流的操作后代码的简洁。

使用

使用Stream的步骤如下:

  1. 创建Stream
  2. 通过一个或多个中间操作将流转换成另一个流
  3. 通过中止操作获取结果.

1.创建Stream

集合类Collection:

  • stream(): 创建串行流
  • parallelStream(): 创建并行流

数组:

Arrays.stream(arr): 通过静态方法获取数组的串行流

Arrays.stream(arr, int, int): 返回数组的串行流,指定数组范围

数字类:

IntStream: 整型的流接口, 有如下静态方法:

  • empty(): 获取一个空的串行流
  • generate(IntSupplier): 返回指定接口产生的数字无限流
  • of(int,int...): 返回指定数字的串行流
  • of(int): 返回包含指定数字的串行流
  • range(start, end): 返回从start到end的整数流, 前闭后开
  • rangeClosed(start, end): 返回从start到end的整数流, 前闭后闭

DoubleStream: 小数的流接口, 有如下静态方法:

  • of(double,double...): 返回指定数字的串行流
  • of(double): 返回包含指定数字的串行流
  • generate(IntSupplier): 返回指定接口产生的数字无限流

LongStream: 长整形的流接口, 有如下静态方法:

  • generate(IntSupplier): 返回指定接口产生的数字无限流
  • of(long,long...): 返回指定数字的串行流
  • of(long): 返回包含指定数字的串行流
  • range(start, end): 返回从start到end的整数流, 前闭后开
  • rangeClosed(start, end): 返回从start到end的整数流, 前闭后闭

Random: 随机数, 有如下方法生成流(不是静态方法)

  • doubles(): 返回无限的随机数流, 值在0-1之间
  • double(long): 返回给定数量的随机数流, 值在0-1之间
  • doubles(start, end): 返回无限的随机数流, 值在start-end之间
  • doubles(long, start, end): 返回给定数量的随机数流, 值在start-end之间
  • ints(), longs() 与doubles函数相同

等等操作, 请自行尝试

2.流操作

Stream: 流的接口, 其中定义了如下对流中间操作的方法:

  • distinct(): 对流中元素去重, 通过equals函数
  • filter(function): 对流中元素进行过滤, 去除经过方法返回false的元素
  • limit(long): 截取流的前long个元素
  • skip(long): 丢弃流中的前long个元素
  • map(function): 将流中的每个元素经过方法进行计算
  • mapToDouble(function): 将流中每个元素经过方法转换成Double
  • mapToInt(function): 将流中每个元素经过方法转换成Int
  • mapToLong(function): 将流中每个元素经过方法转换成Long
  • sorted(): 对流中元素根据自然顺序进行排序
  • sorted(function): 根据方法的比较结果对流中元素进行排序

当然还有其它操作

3.获取结果操作

Stream: 流的接口, 其中定义了如下对流结果操作的方法:

  • forEach(function): 对流中元素进行遍历
  • allMatch(function): 判断流中是否所有元素经过函数均为true
  • anyMatch(function): 判断流中是否存在经过函数返回true的原上诉
  • noneMatch(function): 判断流中是否所以有元素经过函数均为false
  • count(): 统计流中元素的个数
  • max(function): 经过指定函数进行比较,返回最大值
  • min(function): 经过指定函数进行比较,返回最小值
  • toArray(): 将流转换成数组

当然还有其他操作,更多操作, 请自行尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 注解原理

下面来看看Java中注解是如何实现的 创建注解类Inter: 创建测试类Test: 在程序第二句设置断点,可以看到: 可以看到,注解的实例是一个动态代理类的对象. 要想查看这个动态代理类,可以在代码中加 System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", …

myeclipse导入项目报错Target runtime Apache Tomcat v8.0 is not defined

今天想要查看一个现有的项目,本着最好使用原版本开发工具的奇怪想法,下载了一个myeclipse,在导入项目的时候报了一个错误 问题倒是挺明确的,就是项目需要的tomcat运行环境没有,有两种方法解决: 第一种方…

Android Studio查找功能(搜索功能)及快捷键

1、在当前窗口查找文本【CtrlF】 F3 向下查找关键字出现位置 ShiftF3 向上一个关键字出现位置 2、在当前工程内查找文本【CtrlShiftF】 先会弹出一个对话框,直接点击【find】,开始在整个工程内查找该字符串 查找结果如下: 3、查找类【C…

On the coexistence of transport protocols in data centers

论文信息:S. M. Irteza, A. Ahmed, S. Farrukh, B. N. Memon, and I. A. Qazi.On the coexistence of transport protocols in data centers. In Proceedings of IEEE ICC, 2014.数据中心传输协议的共存 摘要 云数据中心的出现直接导致了数据中心TCP(D…

如何做科研20171206

昨日听董大一席话,感触颇多,今日在此进行记录。(加粗字体为董大箴言) ① 关于看论文 董大问我你最近看了什么论文,我说,论文的题目没有记下来,只记得主要讲了什么。我以前一直以为一篇论文的阅…

contiki cooja仿真

最近在做contiki平台上的一些cooja仿真的东西,发现现在网上能学到的东西实在是很有限,现在在这里将我最近学到的一些东西做一下总结。 一、 关于运行的一般步骤: https://www.zhihu.com/question/48708549/answer/139050874 知乎上这个问…

6大设计原则之单一职责原则

单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路对类图进行修正,如下图所示 其实,在实际使用中我们更倾向于使用两个…

6大设计原则之里氏替换原则

面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性提高代码的重用性子类可以形如父类,但又异于父类提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类来实现的提高产品或项目的开放性 缺点如下: 继承是侵入性的.只要继承,就…

6大设计原则之接口隔离原则

接口隔离原则的定义 什么是接口. 实例接口,比如定义了一个Person类,然后 Person p new Pserson(); 产生一个实例,Person类就是 p 的接口类接口,就是Java中使用 interface 定义的接口 什么是隔离 隔离要求将接口尽量细化,同时接口中的方法尽量少. 接口隔离原则的实现 比如…

论文写作——origin画图

一 origin的安装 详见下面网址,内涵下载路径和破解方法。 http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址:https://thepcgo.com/origin-pro-8-0-free-download/ 2.下载破解相关压缩包 链接:https://pan.baidu.com/s/1LwA…

论文写作——texstudio+texlive

一 安装 安装见下方链接 https://jingyan.baidu.com/article/63f236287febc50208ab3deb.html 二 使用 1、选择模板 IEEE: https://ieeeauthorcenter.ieee.org/create-your-ieee-article/use-authoring-tools-and-ieee-article-templates/ieee-article-templates/ ACM:…

论文写作——如何作图(visio/ppt+Adobe Acrobat Pro)

前言 在论文中,基本上的图都要求是矢量图,就是即使放大也不会失真。 .eps是最常被要求用的,然而我使用了各种方法(可以试试在线转换格式,很方便)都没能成功转成打得开看得见的.eps格式,又懒得…

23种设计模式之单例模式

单例模式的定义 定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的通用类图如下: 单例模式的优缺点 单例模式的优点: 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而且创建和销毁时性能又无…

23种设计模式之工厂方法模式

工厂方法模式的定义 定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类 工厂方法模式的通用类图: 其中 Product 负责产品的共性,实现对事物最抽象的定义; Creator 为抽象创建类, 也就是抽象工厂, 具体如何创建产品类是由具体…

23中设计模式之抽象工厂模式

抽象工厂模式的定义 定义: 为创建一组相关或互相依赖的对象提供一个接口,而且无须制定它们的具体类 抽象工厂模式的实现 两个产品族, 其类图如下: 抽象产品类代码如下: 产品A的1级和2级类代码如下: 产品B与产品A类似 抽象工厂类 AbstractCreator 的职责是定义 每个工厂要实…

23种设计模式之模板方法模式

模板方法模式的定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中. 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 通俗的讲,就是将子类相同的方法, 都放到其抽象父类中 类图如下: 其中, AbstractClass 叫抽象模板, 它的方法分为以下两类: 基…

23种设计模式之建造者模式

建造者模式的定义 建造者模式也叫生成器模式, 定义如下: 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示 类图如下: 在建造者模式中, 四个角色如下: Product 产品类: 通常是实现了模板方法模式, 也就是有模板方法和基本方法Builder 抽象建造者…

23种设计模式之原型模式

原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象…

课堂笔记——Data Mining(1)

一、Introduction …… 1、Major Issues in Data Mining User Interaction Presentation and visualization of data mining results : Efficiency and Scalability Diversity of data types: complex types of data; Mining dynamic, networked, and global data reposit…

23种设计模式之代理模式

代理模式的定义 代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫做委托模式, 它是一项基本设计技巧. 许多其他的模式, 如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式, 而且在日常的应用中,…