Stream初步应用
一、什么是stream
Stream(流)是一个来自数据源的元素队列并支持聚合操作,数据来源可以从inputstream,数组,集合中获取;聚合操作可以类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
二、stream基本方法的使用
public class StreamRefer {
public List<String> names = new ArrayList<>();
/**
* 流获取方式
*/
@Test
public void testGetStream(){
//流的获取
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
//方式一:通过集合的stream方法获取
Stream stream1 = names.stream();
System.out.println(stream1);
//方式二:通过stream的of方法获取
Stream stream2 = Stream.of(names);
System.out.println(stream2);
//方式三:通过parallelStream来创建并行流
Stream stream = names.parallelStream();
System.out.println(stream);
}
/**
* 流的方法测试
*/
@Test
public void testStreamMethodForeach(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//void forEach(Consumer action)对流进行循环操作,输入一个参数,无参数输出,无法流式编程
nameStream.forEach(s-> System.out.println(s.toUpperCase()));
}
@Test
public void testStreamMethodFilter(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//filter(Predicate p) 返回一个与给定判断条件匹配的元素组成的流,接受一个输入参数,返回一个booleal值,可以流式编程
nameStream.filter(s->s.length()>4).forEach(System.out::println);
}
@Test
public void testStreamMethodCount(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//count() 返回一个参数流的个数
System.out.println(nameStream.count());
}
@Test
public void testStreamMethodLimit(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
/*
* Stream limit(long maxSize) 获得流中前 maxSize 个元素,将元素添加到另一个流中返回
*如果 maxSize 大于等于当前流的元素个数,则所有元素都会获取到
*如果 maxSize 等于 0,则会获得一个空流。
*可以流式编程
*/
//1.获取前面几个流,当为0是为空流但不会为null
Stream<String> limitStream = nameStream.limit(0);
System.out.println(limitStream);
limitStream.forEach(System.out::println);
//2.获取前面几个流,当为大于size返回整个流
Stream<String> limitStreamWhole = nameStream.limit(5);
limitStreamWhole.forEach(System.out::println);
//3.获取前面几个流,当为小于于size大于0返回整个流
Stream<String> limitStreamPart = nameStream.limit(2);
limitStreamPart.forEach(System.out::println);
}
@Test
public void testStreamMethodSkip(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//跳过前面几个,可以流式编程
nameStream.skip(1).forEach(System.out::println);
}
@Test
public void testStreamMethodMap(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
List<String> values = new ArrayList<>();
values.add("张三");
values.add("李四");
Stream<String> nameStream = names.stream();
Stream<String> valueStream = values.stream();
// Stream concat(Stream a,Stream b)两个流合并返回一个新的流
Stream.concat(nameStream,valueStream).forEach(System.out::println);
}
@Test
public void testStreamMethodConcat(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//map(Function mapper) 该接口需要一个 Function 函数式接口参数,可以将当前流中的 T 类型数据转换为另一种 R 类型的流。
nameStream.map(name -> name.length()).forEach(System.out::println);
}
@Test
public void testStreamMethodSort(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
Stream<String> nameStream = names.stream();
//sorted(Comparator<? super T> comparator)排序
nameStream.map(name -> name.length()).sorted().forEach(System.out::println);
}
@Test
public void testStreamMethodCollect(){
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
//collect(toList())将流转成集合
List<Integer> convertCoinTypes = names.stream().map(coinType -> coinType.length()).collect(toList());
convertCoinTypes.forEach(System.out::println);
}
}
三、stream总结
注意点:①在流式编程中一样需要符合lambda表达式对域的规范;
②流式编程可以简化我们的编码风格。
Stream初步应用的更多相关文章
- Stream初步认识(一)
Stream初步认识(一)测试 简介 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对 集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream AP ...
- Java8 stream学习
Java8初体验(二)Stream语法详解 Java 8 flatMap示例 第一个Stream Demo IDEA里面写Stream有个坑 虽然java文件中没错,但是但编译的时候还是报错了, In ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- 分布式消息系统Kafka初步
终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...
- CMake初步(2)
转自:<你所不知的OSG>第一章:CMake初步(2) http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229& ...
- 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为
初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...
- C++面向对象程序设计之C++的初步知识
本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章 C++的初步知识 后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...
- centos中pipelinedb安装及初步使用
安装 下载安装包 https://www.pipelinedb.com/download 创建系统文件目录和日志目录 pipelinedb安装 使用非root用户,初始化pipelinedb 修改配置 ...
随机推荐
- html css+div+jquery实现图片轮播
一直想自己动手做一个图片轮播的控件,查查网上的资料大多引用已经做好的组件,其原理算法不是很清楚,于是自己用jquery写了一个.先看下效果图: 主要界面实现思路如下: 1.新建一个div宽度为100% ...
- 获取Xcode工程所有的类名
有的时候在需求中需要获取工程中所有的类名.例如在获取工程中继承某个类的列表. 核心代码如下: unsigned ; const char **classes = nil; Dl_info info; ...
- python3 sys.path
wadmin@ansible-test:~/python$ python3Python 3.6.7rc1 (default, Sep 27 2018, 09:51:25) [GCC 8.2.0] on ...
- Qt学习--信号与槽(多窗口的实现)
按照helloword的创建过程 创建一个新的项目(项目名:window) 之后进行多窗口的实现过程: (参考:http://www.qter.org/portal.php?mod=view& ...
- Python学习笔记,day3
Python学习第三天 一.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作: s = ...
- JavaScript线程(第八天)
js是单线程的: js中的线程分为三种 1.页面渲染 2.主代码逻辑 3.事件触发: 下面我们来看一段代码 <script> setTimeout(function(){ conso ...
- 【scarpy】笔记三:实战一
一.前提 我们开始爬虫前,基本按照以下步骤来做: 1.爬虫步骤:新建项目,明确爬虫目标,制作爬虫,存储爬虫内容 二.实战(已豆瓣为例子) 2.1 创建项目 1.打开pycharm -> 点开te ...
- 树的子结构(JAVA)
树的子结构 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) public boolean HasSubtree(TreeNode root1, T ...
- docker 网络 路由
通过在Docker宿主机上添加静态路由实现跨宿主机通信 模拟环境 主机1(192.168.58.144) 设置docker0 网关 (172.17.0.1/16) 主机2 ...
- gcc and g++ 常用参数解释
程序编译运行的过程 预处理.处理一些#include,#define命令,生成.i或者.ii文件: 编译.编译器进行语法分析,语义分析,中间代码生成,目标代码生成,优化,生成.s文件 汇编.汇编器把汇 ...