Stream流的个人理解

  整体来看,流式思想类似于工厂车间的“生产流水线”,通过一些列操作来获取我们需要的产品

  在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

  “Stream流”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。

  当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤方案,然后再按照方案去执行它

一.Stream流_Stream流进行集合过滤的效果演示

    1).什么是Stream它在Java中是一个接口它类似于迭代器Stream比迭代器的功能更强大。

                 它也是用来处理集合中的元素,但比迭代器的功能更多。

    2).Stream流可以对集合元素进行连续的筛选、过滤、统计等操作。它再结合Lambda表达式的使用,

         使得这些操作变得非常的简单。

   3).示例代码:

public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰"); //1.筛选出所有的张姓学员,并存储到一个新集合
List<String> list1 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).startsWith("张")) {
list1.add(list.get(i));
}
}
//2.再筛选出张姓学员中名字是3个字的学员,并存储到一个新集合
List<String> list2 = new ArrayList<>();
for (int i = 0; i < list1.size(); i++) {
if (list1.get(i).length() == 3) {
list2.add(list1.get(i));
}
} //3.打印名字是3个字的学员中的第一名学员:
System.out.println(list2.get(0)); System.out.println("----------------------------------"); //使用Stream流结合Lambda表达式
list.stream().filter(s -> s.startsWith("张"))
.filter(s -> s.length() == 3)
.limit(1)
.forEach(System.out::println);
}
}

二.Stream流思想概述

1.流思想:类似于迭代器,用于对”集合元素”和数组进行筛选,过滤,统计用的

2.流的工作方式:流对象的每一个操作都会使这个对象成为垃圾;但这个操作的方法通常会返回一个新流对象

每个流对象都是一次性的,类似于流水线

三. Stream流_获取List_Set_Map_数组流

1.通过Collection集合(List,Set)获取流

List:

List list=new ArrayList();

list.stream();

Set:

Set set=new HashSet();

set.stream();

2.通过Map集合获取流(Map集合不能直接获取流,只能先转成Set再获取)

方式一:

Map map=new HashMap();

Set<Map.Entry> set=map.entrySet();

set.stream();

方式二:

Map map=new HashMap();

Set set=map.values();

set.stream();

Set set1=map.keySet();

set1.stream();

3.通过数组获取流:

A).通过引用类型数组获取流:

Integer[] arr1 = {1,2,3,4};

String[] arr2 = {"a","b","c"};

//1.获取Integer[]数组的流

Stream<Integer> integerStream = Stream.of(arr1);

//2.获取String[]数组的流

Stream<String> stringStream = Stream.of(arr2);

B).通过基本类型数组获取流:

int[] arr = {1,2,3,4};

IntStream s1 = IntStream.of(arr);

四. Stream流_常用方法_逐一处理forEach

1.伪代码

        class Stream流的子类<T>{

            //所有元素

            public void forEach(Consumer<T> c){

                //1.遍历每个元素

                for(T t : 所有元素){

                    //3.将每个元素放到Consumeraccept()方法过一下

                    c.accept(t);

                }

            }

        }

2.只需要重写Consumer接口中的accept方法即可,并传入forEach,forEach参数可以是匿名内部类,lambda或者方法引用

五. Stream流_常用方法_过滤filter

Stream<T>

filter(Predicate<? super T> predicate)

针对相应条件对流中数据进行过滤,过滤的代码只要重写Predicate接口中test方法即可,test方法返回值为boolean类型,对于返回false的元素过滤出去

六. Stream流_常用方法_统计个数count

针对流的操作,统计流中元素的个数并返回long类型值,调用count方法不需要传入参数

七. Stream流_常用方法_取用前几个limit

取流中前几个元素,limit方法参数为int类型,代表元素个数, 重新返回一个新流

八. Stream流_常用方法_跳过前几个skip

取流中第n个元素以及之后的数据,limit方法参数为int类型,代表跳过元素个数,重新返回一个新流

九. Stream流_常用方法_映射(转换)map

<R> Stream<R>

map(Function<? super T,? extends R> mapper)

调用map方法需要传入函数接口Function或者其子类

定义Function时一般会指定两个泛型,前一个泛型为流中元素类型,后一个泛型代表转换后的元素类型

进行类型转换,传入一个类型,返回另一个类型,

十. Stream流_常用方法_合并concat

concat方法用于将两个流合并成一个流,Stream中的静态方法,调用需要传入两个流参数,返回一个新流

十一. Stream流_总结_拼接方法与终结方法

1).拼接方法:这个方法会返回一个Stream流,可以继续对这个流操作。

    2).终结方法:这个方法返回的是最终的值。不是Stream流,不能对流继续操作。

十二. Stream流_常用方法_收集Stream结果collect方法

1).Stream其实是一个集合元素的函数模型它并不是集合也不是数据结构其本身并不存储任何元素或其地址值

    2).有些时候,我们使用Stream过滤元素后,过滤后的元素时存储在一个新流中,我们希望将这些数据存储到一个新的集合中,

       此时,可以将Stream转换为各种集合:

    3).转换为List集合

        Stream<String> stream = ....;

        //转换为List集合

        List<String> list = stream.collect(Collectors.toList());
      
转换为Set集合

        Set<String>
set = stream.collect(Collectors.toSet());

       转换为数组:

        Object[] objArray =
stream.toArray();

java_stream流的更多相关文章

  1. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  7. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  8. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  9. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

随机推荐

  1. 登录测试用例sql语句注入

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  2. 利用Django进行Web开发

    Web就是用来表示Internet主机上供外界访问的资源的.网页也统称为web资源.Internet上供外界访问的Web资源主要分为如下两类: 静态web资源:指web页面中供人们浏览的数据始终是不变 ...

  3. eclipse中javadoc给项目生成api文档

    步骤 1.打开java代码,编写JavaDoc 注释,只有按照java的规范编写注释,才能很好的生成API文档,javadoc注释与普通注释的区别为多一个*(星号).普通代码注释为/*XXX*/,而j ...

  4. SSM-SpringMVC-32:SpringMVC中灌顶传授文件上传

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 我将用自认为最简单的语言,描述Springmvc的文件上传,来将老夫毕生功力灌顶传授给你 首先文件上传,又简至 ...

  5. 一个bug分析 ----------换个角度,有另外一个天地

    有个接口是按修改时间(updated_time)排序的 优化后,有人反馈接口的返回值有问题 查了一下,反馈的数据是推荐过的(推荐操作是会更新updated_time的). 然后就认为是有人进行了推荐操 ...

  6. composer安装以及更新问题,配置中国镜像源。

    配置国内镜像源 中国镜像源 https://pkg.phpcomposer.com/ composer 中文官网地址 http://www.phpcomposer.com/ 下载 Composer 安 ...

  7. openfire推送离线聊天信息的插件

    插件说明 在手机的聊天应用中,经常出现的一个需求就是把用户的离线消息通过推送系统推送到用户的手机上,为了实现这个功能,本人就开发了本插件,这个openfire 插件是拦截了发给openfire用户的离 ...

  8. python抓取数据构建词云

    1.词云图 词云图,也叫文字云,是对文本中出现频率较高的"关键词"予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨. 先看几个词 ...

  9. memcache 和 redis 之间的区别

    结论 应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能.具体来 ...

  10. golang string和[]byte的对比

    golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) in ...