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. Codeforces Round #809 (Div. 2)C.Qpwoeirut And The City

    题目大意: 当一栋楼比旁边两栋楼都高的时候,这栋楼为cool,对除了1和n以外的所有楼可以增加任意层,问在满足使最多的楼cool的前提下的花费最小. 当n为奇数的情况下: cool的楼实际上是固定的, ...

  2. java安全之CC1浅学(1)

    前言 由于CC链还是比较复杂的,我们可以先看命令执行的部分payload之后再加上反序列化部分组成一个完整的payload 调试一 项目导入依赖,这里使用3.1版本 <!-- https://m ...

  3. Spring Boot 中使用 tkMapper

    说明:基于 MyBatis 有很多第三方功能插件,这些插件可以完成数据操作方法的封装.数据库逆向工程的生成等. tkMapper 和 MyBatis-plus 都是基于 MyBatis 提供的第三方插 ...

  4. Vue3组件间传值

    12种方式 1. 父组件 ./father.vue 点击查看代码 <template> <h1>father:</h1> <h3>子组件传过来的:{{ ...

  5. 【Java集合框架001】为什么重写equals就要重写hashcode?

    一.前言 如果面试官问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法? 遇到这样的问题,应该怎样回答呢?其实,equals和hashCode都 ...

  6. 初探Java安全之JavaAgent

    About Java Agent Java Agent的出现 在JDK1.5版本开始,Java增加了Instrumentation(Java Agent API)和JVMTI(JVM Tool Int ...

  7. SqlServer 联合Update

    --1.创建一个备份表: select * into Users_Bak from Users --2.依据某个表进行更新: update Users_Bak set Users_Bak.Mobile ...

  8. Linux禁止摄像头自动曝光(手动调节曝光)

    前言 很多摄像头具有自动曝光的功能,例如在较暗的调节下,提高曝光率,在较亮的调节下降低曝光.下面简单介绍在linux平台俩种方式来修改自动曝光. 软件调节(图形化界面) 安装qv4l2 sudo ap ...

  9. 解决mysql本地连接速度慢

    解决方法 用127.0.0.1而不用localhost 原因 听说是有什么DNS的反向解析

  10. nginx-1.22.0版本安装

    nginx运行状态查看 查看80端口占用情况:netstat -tunlp | grep 80 # 查看进程是否运行ps -A | grep nginx # 强制关闭nginxpkill nginx ...