一、什么是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初步应用的更多相关文章

  1. Stream初步认识(一)

    Stream初步认识(一)测试 简介 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对 集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream AP ...

  2. Java8 stream学习

    Java8初体验(二)Stream语法详解 Java 8 flatMap示例 第一个Stream Demo IDEA里面写Stream有个坑 虽然java文件中没错,但是但编译的时候还是报错了, In ...

  3. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  4. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  5. 分布式消息系统Kafka初步

    终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...

  6. CMake初步(2)

    转自:<你所不知的OSG>第一章:CMake初步(2) http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229& ...

  7. 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为

    初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...

  8. C++面向对象程序设计之C++的初步知识

    本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章  C++的初步知识  后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...

  9. centos中pipelinedb安装及初步使用

    安装 下载安装包 https://www.pipelinedb.com/download 创建系统文件目录和日志目录 pipelinedb安装 使用非root用户,初始化pipelinedb 修改配置 ...

随机推荐

  1. collections&time&random模块

    一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

  2. Python IO密集型任务、计算密集型任务,以及多线程、多进程

    对于IO密集型任务: 直接执行用时:10.0333秒 多线程执行用时:4.0156秒 多进程执行用时:5.0182秒 说明多线程适合IO密集型任务. 对于计算密集型任务 直接执行用时:10.0273秒 ...

  3. vue学习之路一:安装vue-element-admin项目

    今天看到一个vue网站,觉得很好,立马又有学习vue的冲动了,话不多说,直接贴项目网址: https://github.com/PanJiaChen/vue-element-admin/blob/ma ...

  4. SOCKET.IO 的用法 系统API,

    原文:http://www.cnblogs.com/xiezhengcai/p/3956401.html 1. 服务端 io.on('connection',function(socket)); 监听 ...

  5. mysql中的备份(backup)和恢复(recovery)

    (一)备份类型(backup type) 物理和逻辑备份(Physical Versus Logical Backup) 物理备份是指直接复制存储数据库内容的目录和文件,这种类型的备份适用于出现问题时 ...

  6. Spring的由来以及发展

    Spring简史: 第一阶段:XML配置在Spring1.x时代,都是使用XML配置Bean,随着项目扩大,我们把XML文件切分成多个配置文件,那时候需要频繁地在开发类和配置文件之间切换    第二阶 ...

  7. CF D.Mister B and Astronomers

    题意概括好麻烦, 好吧既然是英文题面那放一下题意. 题意:有 n 个观察员,第一个观察员在 0 秒开始观察星空,随后第i 个观察员会在第 i − 1 个观察员之后 ai 秒观察,第一个观察员也会在第 ...

  8. highchart在IE8下面的显示问题解决

    完整的代码: <!DOCTYPE HTML><html> <head> <meta http-equiv="Content-Type" c ...

  9. macbook远程连接报错no matching cipher found

    在.ssh/目录下添加config文件 Host xxx.xxx.xxx.xxx Ciphers 3des-cbc KexAlgorithms +diffie-hellman-group1-sha1 ...

  10. 剑指offer 5.栈和队列 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   解题思路:1,整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程 ...