流的个人理解:

Stream也就是流,他和IO流不一样,他是java8诞生的东西,我对他的理解就是一个更为高级的容器,他可以轻易的对立面存储的数据进行各种各样的操作,比如过滤,转换,迭代等等。

流对集合,数组等进行了进一步的封装,使开发人员更容易的进行操作。

怎样获得流:

//List.stream
List<String> stringList = Lists.newArrayList();
Stream<String> stream = stringList.stream();
//Arrays.stream
String[] strings = new String[2];
Stream<String> stream1 = Arrays.stream(strings);
//基础类型流
IntStream intStream = IntStream.of(123);
LongStream longStream = LongStream.of(123);
DoubleStream doubleStream = DoubleStream.of(123);
//无限流
Stream.iterate(0, i -> i + 1);//当前值为上一个值+1,永无止境
Stream.generate(Math::random);//每次获得的值是一个随机数,永无止境
这里提一句,这些方法的底层都是StreamSupport.stream(),他会把List,array封装为spliterator,具体细节可以观看源码。

怎样处理流:

中间操作和终端操作介绍:

如果把流看成是水源,水通过管道传输,管道中的各种阀门,可以看成是中间操作,比如过第一个阀门我给他限制排水量,第二个阀门,我往水里加可乐粉,当水离开管道后,把他放入水箱,

是终端操作,这个比喻可能不太恰当,下面写下比较官方的说法。

中间操作:诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。

终端操作:终端操作会从流的流水线生成结果。其结果是任何不是流的值,比如List、Integer,甚至void。

中间操作和终端操作的使用:

@Test
public 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);
}
当然你可能会说这也太复杂了,我不用流也可以简单实现
@Test
public void test() {
    List<String> nameList = Lists.newArrayList();
    for (Person person : allPersonList) {
        if (person.getAge() > 25) {
            nameList.add(person.getName());
        }
    }
    System.out.println(nameList);
}
没错,这样做也很好的实现了,但是你看一下下面的代码
@Test
public 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简介的更多相关文章

  1. .NET Core/.NET之Stream简介 Rx.NET 简介

    .NET Core/.NET之Stream简介   之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core ...

  2. Java8 Stream简介

    Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响. lambd ...

  3. .NET Core/.NET之Stream简介

    之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...

  4. Java Stream简介, 流的基本概念

    在Javaor .net编程中,  我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...

  5. spark stream简介

    1.复杂的迭代计算 假如我们计算的需要100步的计算,但是当我执行到第99步的时候,突然数据消失, 根据血统,从头进行恢复,代价很高 sc.setCheckpointDir("共享存储文件系 ...

  6. java.util.stream 库简介

    Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...

  7. java 8 新特性之Stream的排序/分类

    Stream简介 Stream是Java8提供的一个新的API,它位于java.util.stream包下.Stream API提供了一种新的方式来对Java集合进行操作,这种操作方式极大的提高了Ja ...

  8. Java有关List的stream基本操作

    参考博客: https://www.jianshu.com/p/9fe8632d0bc2 Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有I ...

  9. JDK1.8中的Stream详解

    Stream简介 Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML ...

随机推荐

  1. cmd下进入oracle sqlplus

    1.sqlplus /nolog 2.connect sys/orcl@ORCL as sysdba 3.select sysdate from dual exit;

  2. ik分词器

    ik分词器下载地址:https://code.google.com/archive/p/ik-analyzer/downloads 需要FQ 配置文件: IKAnalyzer2012.jar(主 ja ...

  3. LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD

    题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...

  4. InflateException:Bin file line #19:Error inflating class MyTextView

    InflateException:Bin file line #19:Error inflating class MyTextView 一.错误简介 为了实现TextView的跑马灯效果,我自己写了一 ...

  5. [JavaScript]对象创建方法

    1.使用Object或对象字面量创建对象 (1)使用Object创建对象 var cat= new Object(); cat.name = "Tom"; cat.color= & ...

  6. Springboot项目打成war包,部署到tomcat上,正常启动访问报错404

    前言: 项目介绍,此项目是一个Maven多模块项目,模块项目:all(父模块):util (公用的工具类):dao(实体类.业务类.mapper.mapper.xml):business(业务serv ...

  7. openvswitch的原理和常用命令

    一.Openvswitch工作原理 openvSwitch是一个高质量的.多层虚拟交换机,使用开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码.它的 ...

  8. 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 ...

  9. LitJson使用中需要注意的一些问题(转)

    LitJson使用中需要注意的一些问题 使用C#做Untiy开发时,有解析Json的需求,选择使用了LitJson这个库,因为之前我们是使用lua的,这个库会将Json解析后保存为JsonData,这 ...

  10. ng 实现插入和删除

    结果: 代码: <!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> ...