Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。

概念

Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。

流程

1、把集合转换为流Stream

2、操作Stream流

Stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果

一些常见的中间操作和中止操作

  1. 中间操作(过滤、映射、限制...),可以多个
方法名 方法作用 返回值类型 方法类型
filter 过滤 Stream 中间操作
map 映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素 Stream 中间操作
peek 窥探 Stream 中间操作
skip 跳过前几个 Stream 中间操作
limit 截取前几个 Stream 中间操作
distinct 去重操作(比较的是地址) Stream 中间操作
sorted 排序操作 Stream 中间操作
  1. 终止操作(最常见的是收集),只可以设置1个
方法名 方法作用 返回值类型 方法类型
collect 收集处理结果 泛型 终止操作
count 统计个数 long 终止操作
forEach 逐一处理 void 终止操作
reduce 汇总操作 Optional<> 该对象有get方法可以获取返回值 终止操作

Stream的3个注意事项:

  • Stream中间操作方法返回的是新的流
  • Stream不调用终结方法,中间的操作不会执行
  • Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。
下面是一些小demo
点击查看代码
/**
* 过滤集合中不符合条件的元素
*/
@Test
public void testfilter(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
List<String> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
aList.forEach(System.err::println);
} /**
*去重
*/
@Test
public void testDistinct(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<String> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
distinctStr.forEach(System.out::println);
//--------------------------------
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
ArrayList<Product> proList = Lists.newArrayList(prod1, prod2, prod3);
List<Product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
distinctProList.forEach(System.out::println);
} /**
* limit(n)获取流中的前n个元素
*/
@Test
public void testLimit(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<String> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
System.out.println(limitStr);
} /**
* skip(n)
*/
@Test
public void testSkip(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
System.out.println(skipStrList);
} /**
* map() 接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素
*/
@Test
public void testMap(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
System.out.println(mapStrList);
} @Test
public void testSorted(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
System.out.println(sortedStrList);
} /**
* collect():将流转换为其他形式 list set map
*/
@Test
public void testCollect(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Set<String> collectSet = stringList.stream().collect(Collectors.toSet());
System.out.println(collectSet);
} /**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testReduce(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Optional<String> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
if (reduce.isPresent()) System.out.println(reduce.get());
} /**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testCount(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
long count = stringList.stream().count();
System.out.println(count);
}

Java8Stream流的更多相关文章

  1. java8-Stream流API

    一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...

  2. 侠说java8--Stream流操作学习笔记,都在这里了

    前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...

  3. Java基础一篇过(七)Java8--stream流

    一.简介 流(stream)也是Java8的一个重要的新特性,主要是对集合(Collector)功能的增强:在上一篇文章我们简单的了解了lambda表达式,现在我们学习下流的概念:使用流可以帮助我们做 ...

  4. java8中的stream流遍历

    比较for循环.迭代器.java8Stream流遍历的不同 package cnom.test.testUtils; import java.io.Serializable; import java. ...

  5. java8-Stream之数值流

    在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱.虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面.Java8引入了3个原始类型特化流接口来解决这个问 ...

  6. 流式计算(一)-Java8Stream

    大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...

  7. java8--stream

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  8. 流式计算(二)-Kafka Stream

    前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...

  9. 024:Java流实现Shell:cat 1.log | grep a | sort | uniq -c | sort -rn

    本文阅读时间大约13分钟(本文实践性很强,建议pc端阅读,最好亲自实践). 参考答案 这个问题考察的是对Linux命令的熟悉程度,以及对Java中集合操作的综合运用,自从转到Java 8以后,我就一直 ...

  10. java8-Stream集合操作快速上手

    java8-Stream集合操作快速上手   目录 Stream简介 为什么要使用Stream 实例数据源 Filter Map FlatMap Reduce Collect Optional 并发 ...

随机推荐

  1. Python基础之面向对象:3、继承与派生

    面向对象 一.三大特征之继承 python三大特征: 封装.继承.多态 三者中继承最为核心,实际应用对,感受较为直观 封装和多态略微抽象 1.继承的概念 继承的含义: ​ 在现实生活中,继承表示人与人 ...

  2. 我的Spark学习笔记

    一.架构设计 Driver根据用户代码构建计算流图,拆解出分布式任务并分发到 Executors 中去:每个Executors收到任务,然后处理这个 RDD 的一个数据分片子集 DAGSchedule ...

  3. 畅联新增插件:新增依爱NB烟感

    双美接入,C++版,就是解析Json时稍微有点问题,依爱这边的Json格式,Value字段竟然是单引号....呵呵,反正也解决了. 备注一下:电信模式,AEP平台模式.

  4. SpringBoot使用poi实现导出excel

    //实体类 //导出的数据的实体 public class User { private String id; private String name; private String year; // ...

  5. Json web token(JWT)攻防

    免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容 ...

  6. Postman使用指导

    1. 下载好Postman,不用注册账号,直接离线使用 2. 软件的配置修改: 2.1关闭SSL认证 2.2关闭系统代理 2.3上传证书填写hosthost为服务器地址和端口:crt和key可以通过国 ...

  7. 通过docker部署grafana和mysql

    阅读本文需要一定的Linux, Docker与MySQL知识, 例如: 会启动容器, 进入容器; 会创建表, 会使用INSERT语句, 会使用SELECT语句... 1. 简介 2. 网络设置 - 2 ...

  8. vue3.0使用tui.image-editor图片编辑组件报错TypeError: Cannot convert undefined or null to object

    在vue3.0的项目中使用tui.image-editor组件.一直都是报错.查看报错位置发现代码 addEventListener() { Object.keys(this.$listeners). ...

  9. linux驱动移植

    1.1 开发前准备 1.1.1 Linux 驱动(面向对象) 1).Linux 驱动框架 思想:写驱动的时候,只提供操作硬件设备的函数接口 文件存放磁盘: open ,read ,write ,clo ...

  10. CheckBox 单选实现及取值

    <input name="ck" type="checkbox" value="1"/><span>按计划进行< ...