(7)Stream简介
流的个人理解:
Stream也就是流,他和IO流不一样,他是java8诞生的东西,我对他的理解就是一个更为高级的容器,他可以轻易的对立面存储的数据进行各种各样的操作,比如过滤,转换,迭代等等。
流对集合,数组等进行了进一步的封装,使开发人员更容易的进行操作。
怎样获得流:
//List.streamList<String> stringList = Lists.newArrayList();Stream<String> stream = stringList.stream();//Arrays.streamString[] strings = new String[2];Stream<String> stream1 = Arrays.stream(strings);//基础类型流IntStream intStream = IntStream.of(1, 2, 3);LongStream longStream = LongStream.of(1, 2, 3);DoubleStream doubleStream = DoubleStream.of(1, 2, 3);//无限流Stream.iterate(0, i -> i + 1);//当前值为上一个值+1,永无止境Stream.generate(Math::random);//每次获得的值是一个随机数,永无止境这里提一句,这些方法的底层都是StreamSupport.stream(),他会把List,array封装为spliterator,具体细节可以观看源码。 |
怎样处理流:
中间操作和终端操作介绍:
如果把流看成是水源,水通过管道传输,管道中的各种阀门,可以看成是中间操作,比如过第一个阀门我给他限制排水量,第二个阀门,我往水里加可乐粉,当水离开管道后,把他放入水箱,
是终端操作,这个比喻可能不太恰当,下面写下比较官方的说法。
中间操作:诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。
终端操作:终端操作会从流的流水线生成结果。其结果是任何不是流的值,比如List、Integer,甚至void。

中间操作和终端操作的使用:
@Testpublic void test(){ Stream<Person> stream = allPersonList.stream(); //只留下年龄大于25的人,中间操作 Stream<Person> personStream = stream.filter(person -> person.getAge() > 25); //将person流提取出name转换成String流,中间操作 Stream<String> personNameStream = personStream.map(Person::getName); //将流收集起来转换成List,终端操作 List<String> nameList = personNameStream.collect(Collectors.toList()); System.out.println(nameList);}当然你可能会说这也太复杂了,我不用流也可以简单实现@Testpublic void test() { List<String> nameList = Lists.newArrayList(); for (Person person : allPersonList) { if (person.getAge() > 25) { nameList.add(person.getName()); } } System.out.println(nameList);}没错,这样做也很好的实现了,但是你看一下下面的代码@Testpublic void test() { //筛选出年龄大于25的人的名字,是不是向读这句话一样简单的读完了这行代码 List<String> nameList = allPersonList.stream().filter(person -> person.getAge() > 25).map(Person::getName).collect(Collectors.toList()); System.out.println(nameList);} |
这里还有提一点,Stream的操作属于懒加载,在终端操作执行前,所有的中间操作实际上都没有执行,他们每次都返回一个新的流并且把老的流存入他的成员变量里,这些中间操作形成了一个链表,在执行终端操作时,这些中间操作才会进行真正的操作。
(7)Stream简介的更多相关文章
- .NET Core/.NET之Stream简介 Rx.NET 简介
.NET Core/.NET之Stream简介 之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core ...
- Java8 Stream简介
Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响. lambd ...
- .NET Core/.NET之Stream简介
之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...
- Java Stream简介, 流的基本概念
在Javaor .net编程中, 我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...
- spark stream简介
1.复杂的迭代计算 假如我们计算的需要100步的计算,但是当我执行到第99步的时候,突然数据消失, 根据血统,从头进行恢复,代价很高 sc.setCheckpointDir("共享存储文件系 ...
- java.util.stream 库简介
Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...
- java 8 新特性之Stream的排序/分类
Stream简介 Stream是Java8提供的一个新的API,它位于java.util.stream包下.Stream API提供了一种新的方式来对Java集合进行操作,这种操作方式极大的提高了Ja ...
- Java有关List的stream基本操作
参考博客: https://www.jianshu.com/p/9fe8632d0bc2 Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有I ...
- JDK1.8中的Stream详解
Stream简介 Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML ...
随机推荐
- cmd下进入oracle sqlplus
1.sqlplus /nolog 2.connect sys/orcl@ORCL as sysdba 3.select sysdate from dual exit;
- ik分词器
ik分词器下载地址:https://code.google.com/archive/p/ik-analyzer/downloads 需要FQ 配置文件: IKAnalyzer2012.jar(主 ja ...
- LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD
题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...
- InflateException:Bin file line #19:Error inflating class MyTextView
InflateException:Bin file line #19:Error inflating class MyTextView 一.错误简介 为了实现TextView的跑马灯效果,我自己写了一 ...
- [JavaScript]对象创建方法
1.使用Object或对象字面量创建对象 (1)使用Object创建对象 var cat= new Object(); cat.name = "Tom"; cat.color= & ...
- Springboot项目打成war包,部署到tomcat上,正常启动访问报错404
前言: 项目介绍,此项目是一个Maven多模块项目,模块项目:all(父模块):util (公用的工具类):dao(实体类.业务类.mapper.mapper.xml):business(业务serv ...
- openvswitch的原理和常用命令
一.Openvswitch工作原理 openvSwitch是一个高质量的.多层虚拟交换机,使用开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码.它的 ...
- linux/unix shell bash script 小记
#script PSAATL11*` do $i | awk -F ':' '{print $1}'` do ((k=j+)); m=$(zcat $i | sed -n ${j},${k}p); e ...
- LitJson使用中需要注意的一些问题(转)
LitJson使用中需要注意的一些问题 使用C#做Untiy开发时,有解析Json的需求,选择使用了LitJson这个库,因为之前我们是使用lua的,这个库会将Json解析后保存为JsonData,这 ...
- ng 实现插入和删除
结果: 代码: <!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> ...