java_stream流
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.将每个元素放到Consumer的accept()方法过一下
c.accept(t);
}
}
}
2.只需要重写Consumer接口中的accept方法即可,并传入forEach,forEach参数可以是匿名内部类,lambda或者方法引用
五. Stream流_常用方法_过滤filter
针对相应条件对流中数据进行过滤,过滤的代码只要重写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或者其子类
定义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流的更多相关文章
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
随机推荐
- 关于mysql中的DDL,DML,DQL和DCL
SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 1.数据定义语言DDL(Data Definition Language) 对象: 数据库和表 ...
- URL 规范 整理
URL 规范 不用大写:(强制) 用中杠-不用下杠_:(强制) 参数列表要encode,编码使用utf-8:(强制) URI中的名词表示资源集合,使用复数形式.(建议) 增加版本号(建议) URI中统 ...
- textarea 里设置 style="resize:none"
禁止textarea拉伸的方法是:: 设置这个 style="resize:none" 属性 例子: < ...
- linux定时任务cron配置
实现linux定时任务有:cron.anacron.at,使用最多的是cron任务 名词解释 cron--服务名:crond--linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 ...
- Scrapy爬虫框架第七讲【ITEM PIPELINE用法】
ITEM PIPELINE用法详解: ITEM PIPELINE作用: 清理HTML数据 验证爬取的数据(检查item包含某些字段) 去重(并丢弃)[预防数据去重,真正去重是在url,即请求阶段做] ...
- What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security
18.5.1 Timeouts One issue is that the expected CSRF token is stored in the HttpSession, so as soon a ...
- range与enumerate的区别
在迭代中enumerate比range更能灵活,一般情况下尽量用erumerate,下面举例说明: 先来看range的使用: city_list = ['beijing', 'shanghai', ' ...
- 玩转PHP(二)--PHP强大的时间函数:date()
PHP具有相对来说强大的时间函数date(),该方法有下列一系列参数: 例如: echo date("Y-m-d H:i:s"); //2015-01-09 13:03:30 如果 ...
- mysql主从复制搭建
1.准备工作: 准备一台主服务器,我的IP地址为192.168.13.138,和一台从服务器:192.168.13.137,数据库版本一致,主从库都建好相应的库和表: 2.修改主从服务器的mysql配 ...
- SDOI2017 BZOJ 4820 硬币游戏 解题报告
写在前面 此题网上存在大量题解,但本人太菜了,看了不下10篇均未看懂,只好自己冷静分析了.本文将严格详细地论述算法(避免一切意会和玄学),因此可能会比其它题解更加理论化一些,希望能对像我一样看了其它题 ...