网站首页 > 博客文章 正文
昨天粗略的介绍了下java8中的一些特性,对Stream API也做了简单的介绍。这次单独来介绍下Stream API中的一些常用的方法。因为这个Stream流在平时的开发中使用的频率还是蛮高的。
介绍:
Java 8 API 中的Stream(流)是一种用于处理集合数据的抽象概念。它提供了一种声明式的方式来处理数据,类似于使用 SQL 语句从数据库中查询数据。Stream使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。
Stream(流)是一个来自数据源的元素队列并支持聚合操作:
- 元素:是特定类型的对象,形成一个队列。
- 数据源:流的来源,可以是集合、数组、I/O channel、产生器 generator 等。
- 聚合操作:类似 SQL 语句一样的操作,比如filter、map、reduce、find、match、sorted等。
和以前的Collection操作不同,Stream操作还有两个基础的特征:
- Pipelining:中间操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格(fluent style),这样做可以对操作进行优化,比如延迟执行(laziness)和短路(short-circuiting)。
- 内部迭代:以前对集合遍历都是通过Iterator或者For-Each的方式,显式地在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。
在 Java 8 中,集合接口有两个方法来生成流:
- stream():为集合创建串行流。元素按顺序依次处理;适用于大多数常规的顺序处理逻辑
- parallelStream():为集合创建并行流。以并行的方式处理元素,利用多核 CPU 的优势来提高处理效率。
1.Stream流的获取方式
- 根据Collection获取
- 通过Stream的of方法
2.Stream常用方法介绍
- filter(Predicate<? super T> predicate):根据指定条件进行过滤。
可以通过filter方法将一个流转换成另一个子集流:
Stream<T> filter(Predicate<? super T> predicate);
- map(Function<? super T,? extends R> mapper):对元素进行映射转换。
将流中的元素映射到另一个流中,可以使用map方法:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
- flatMap(Function<? super T,? extends Stream<? extends R>> mapper):将每个元素映射为一个流并展平。
flatMap方法主要用于将流中的每个元素转换为一个新的流,然后将这些新生成的流中的元素全部“展平”合并到一个新的流中。它特别适用于处理元素本身又包含多个子元素的情况。比如,一个元素是一个包含多个值的集合,通过flatMap可以将这些值都提取出来组成一个新的流。
- distinct():去除重复元素。
Stream流中的distinct方法对于基本数据类型是可以直接出重的,但是对于自定义类型,我们是需要重写hashCode和equals方法来移除重复元素。
- sorted(Comparator<? super T> comparator):排序。
- limit(long maxSize):限制流的长度。
- skip(long n):跳过前 n 个元素。
- forEach(Consumer<? super T> action):对每个元素执行操作。
void forEach(Consumer<? super T> action); // 用来变量数据
- collect(Collector<? super T, A, R> collector):收集流的结果到特定结构。
- reduce(BinaryOperator<T> accumulator):进行归约操作。
- count():计算元素数量。
- anyMatch(Predicate<? super T> predicate):是否存在至少一个匹配元素。
- allMatch(Predicate<? super T> predicate):是否所有元素都匹配。
- noneMatch(Predicate<? super T> predicate):是否没有元素匹配。
以上就是总结的Stream的经常使用的一些使用方法,在开发中也比较常见。具体的使用需要结合实际情况选择合适的方法进行使用。
猜你喜欢
- 2024-12-26 Java 8 Stream 处理大数据集:实战与优化
- 2024-12-26 面试官:Java8 lambda 表达式 forEach 如何提前终止?
- 2024-12-26 Javascript中,forEach和map到底有什么区别?
- 2024-12-26 Excel VBA之For Each遍历循环的应用
- 2024-12-26 为什么建议使用 for…of 循环而不是 foreach 循环呢
- 2024-12-26 前端开发map和foreach区别,map遍历方式用法介绍
- 2024-12-26 Rust语言从入门到精通系列 - 零基础掌握Stream流迭代器
- 2024-12-26 Map遍历的四种方法效率对比
- 2024-12-26 java集合类之java中集合类有哪些?如何分类?
- 2024-12-26 【一分钟学Java】之List
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 357℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)