流相关的方法可以分为三种类型,分别是:获取Stream流、中间方法、终结方法。中间方法会返回当前流,可以方便的进行链式调用。

流不可重复使用,否则会报错:

java.lang.IllegalStateException: stream has already been operated upon or closed

    // 获取流的方式
List<Integer> list = Arrays.asList(1, 2, 4, 5, 5, 6, 7, 0);
String [] strArr = new String[]{"aaa", "bbb", "aaa"}; Stream<Integer> stream = list.stream(); // 从列表获取流
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); // 从可变参数获取流
Stream<String> arrStream = Stream.of(strArr); // 从数组获取流

常见的中间方法:

方法 用途
Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤。
Stream<T> limit(long maxSize) 获取前几个元素
Stream<T> skip(long n) 跳过前几个元素
Stream<T> distinct() 去除流中重复的元素。依赖(hashCode和equals方法)
static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流(也会遍历流,不可执行两次)
Stream<T> sorted(Comparator<? super T> comparator) 对元素进行合并
Stream map(Function<? super T, ? extends R> mapper) 对每个元素进行处理
    // filter()
stream.filter(x -> x > 0).filter(x -> x < 5).forEach(System.out::println); // limit()
integerStream.limit(3).forEach(System.out::println); // skip()
integerStream.skip(3).forEach(System.out::println); // 去重
arrStream.distinct().forEach(System.out::println); // 可将不同类型的Stream拼接到一起,不能执行两次
Stream<? extends Serializable> concat1 = Stream.concat(stream, arrStream); // 将相同元素拼接到一起后,可以直接用一个类型接收
Stream<Integer> concat = Stream.concat(stream, integerStream); // 排序
stream.sorted((x, y)->x - y).forEach(System.out::println); // map()
List<Integer> collect = stream.map((Integer x) -> x * x).collect(Collectors.toList());

常见的收集函数:

| public static <T> Collector toList() | 把元素收集到List集合中 |

| <A> A[] toArray(IntFunction<A[]> generator) | 把元素收集到数组中 |

| public static <T> Collector toSet() | 把元素收集到Set集合中 |

| public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |

    // 收集成List
List<Digit> collect = list.stream().map(Digit::new).collect(Collectors.toList()); // 收集成数组,两个方法等效,务必要转换成对应的数组类型。
Integer[] integers = list.stream().toArray(length -> new Integer[length]);
Integer[] digits = list.stream().toArray(Integer[]::new); // 务必要用对应的类型 // 转换成Set
Set<Integer> collect1 = list.stream().collect(Collectors.toSet()); Digit [] data = new Digit[]{
new Digit("aaa", 10),
new Digit("bbb", 20)
}; // 转换成 Map
Map<String, Integer> collect3 = Stream.of(data).collect(Collectors.toMap(Digit::getDesc, Digit::getValue));

Java Stream流的使用的更多相关文章

  1. 一文带你入门Java Stream流,太强了

    两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:"就想看你写的啊!"你看你看,多么苍白的喜欢啊.那就&qu ...

  2. 全面吃透JAVA Stream流操作,让代码更加的优雅

    全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...

  3. Java Stream 流如何进行合并操作

    1. 前言 Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作.今天我们来看看如何合并 Stream 流. 2. Stream 流的合并 ...

  4. Java Stream 流(JDK 8 新特性)

    什么是 Steam Java 8 中新增了 Stream(流)来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作. 我们知道,Java 中 List 和 S ...

  5. Java | Stream流、泛型、多线程 | 整理自用

    1.lambda 表达式 lambda 的延迟执行 可以对程序进行优化,尤其是使用 if {} else {} 条件判断,先判断条件是否成立,再传入计算好的参数. functionName( para ...

  6. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...

  7. Java Stream流排序null以及获取指定条数数据

    Java8的Stream流的一些用法, //排序 carerVehEntityList = carerVehEntityList.stream().sorted( Comparator.compari ...

  8. Java Stream简介, 流的基本概念

    在Javaor .net编程中,  我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...

  9. Java Stream 自定义Collector

    Collector的使用 使用Java Stream流操作数据时,经常会用到各种Collector收集器来进行数据收集. 这里便深入了解一点去了解Collector的工作原理和如何自定义Collect ...

随机推荐

  1. Web 前端实战:雷达图

    前言 在Canvas 线性图形(五):多边形实现了绘制多边形的函数.本篇文章将记录如何绘制雷达图.最终实现的效果是这样的: 绘制雷达图 雷达图里外层 如动图中所示,雷达图从里到外一共有 6 层,所以, ...

  2. CM311-1a(S905L3系列)玩转桌面

    那安装了ambian后,玩转桌面(安装GUI桌面环境)有没有可能呢?那肯定啊!那桌面有什么用?当然有用,多一种玩法,可以写写代码,上网冲浪,学习linux语法什么的.而且单主机只要40左右,想想看可以 ...

  3. 一个监控工具monit

    最近看了一个问题,monit监控在读取配置文件之后,访问的文件是残留在容器中的,导致认为服务异常,其实一开始容器启动,并没有对应的服务. [root@10-36-235-119.fin-wealth- ...

  4. XXL-JOB最佳实践与升级指南

    前言: xxl-job是国内一款使用者比较多的分布式任务调度平台,我们内部从19年开始使用该款开源软件,使用的是2.0.1版本,并在此基础上做了二次开发,添加了一些定制化的功能.随着使用该定时器的业务 ...

  5. 第七十五篇:Vue兄弟组件传值

    好家伙, 兄弟组件的传值用到Eventbus组件, 1.EventBus的使用步骤 ① 创建 eventBus.js 模块,并向外共享一个Vue的实例对象 ②在数据发送方, 调用bus.$emit(' ...

  6. 完全解析Array.apply(null, { length: 1000 })

    Array.apply(null, { length: 1000 }) 点击打开视频讲解更加详细 在阅读VueJS教程时有这么段demo code: render: function (createE ...

  7. HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)

    这是关于网络指纹识别的两部分系列的第二部分 上一部分我介绍了有关TLS 指纹识别方法(以及在不同客户端的指纹有何区别): https://mp.weixin.qq.com/s/BvotXrFXwYvG ...

  8. Spark 写 Hbase

    package com.grady import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.c ...

  9. Qt5.14.2使用虚拟键盘

    说明 这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard) Tag: QT5,Qt,软件盘.虚拟键盘,Widget程序,QML  作者:474 ...

  10. 使用 Elastic 技术栈构建 K8S 全栈监控 -3: 使用 Filebeat 采集 Kubernetes 集群日志

    文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-3/ 操作步骤 filebeat连接es使用上一步创建的secret: ...