探索JDK8新特性,Stream 流:构建流的多种方式

news2025/3/4 15:32:17

当我们处理集合数据时,往往需要对其进行各种操作,如过滤、映射、排序、归约等。在 Java 8 中引入的 Stream 流为我们提供了一种更加简洁和灵活的方式来处理数据。上述情况都是流对集合进行操作的,但是对于流的创建操作还是不太了解,其实流的创建不止是使用集合进行创建,还可以基于值、数组甚至是文件来构建流,完成流操作。

下文将介绍如何基于 Stream 构建流,为你展示创建和操作流的多种方法。

构建流的方法

在 Java 8 中,有多种方式可以构建 Stream 流,使得数据处理变得更加便捷。以下是一些常见的构建流的方法:

1. 从集合创建流: 使用集合的 stream() 方法可以直接创建流,使得集合中的元素可以流式操作。

2. 从数组创建流: 使用 Arrays.stream() 方法从数组中创建流。

3. 静态工厂方法: Stream 接口提供了一些静态工厂方法,如 Stream.of()Stream.iterate()Stream.generate()

4. 使用 Stream.Builder 使用 Stream.Builder 逐个添加元素,构建流。

5. 从文件创建流: 使用 Files.lines() 方法从文件中创建流,每行都是流中的一个元素。

从集合创建流

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class CollectionToStreamExample {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "kiwi");
        
        Stream<String> stream = fruits.stream();
        
        // 对流进行操作,例如过滤、映射、归约等
        stream.filter(fruit -> fruit.length() > 5)
              .map(String::toUpperCase)
              .forEach(System.out::println);
    }
}

从数组创建流

import java.util.stream.IntStream;

public class ArrayToStreamExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        
        IntStream stream = Arrays.stream(numbers);
        
        // 对流进行操作,例如过滤、映射、归约等
        stream.filter(num -> num % 2 == 0)
              .map(num -> num * num)
              .forEach(System.out::println);
    }
}

在上述示例中,我们通过 Arrays.stream(numbers) 方法从数组创建了一个 IntStream 流。接着,我们对流进行了过滤(保留偶数)、映射(平方)和终端操作(打印结果)。

静态工厂方法

使用 Stream 静态工厂方法可以更加直观地创建流,而无需手动实现遍历和创建元素的逻辑。这样做不仅简化了代码,还能让你的意图更加清晰,使代码更具可读性和可维护性。

  • Stream.of(): 创建一个由指定元素组成的流。
Stream<String> stream = Stream.of("apple", "banana", "orange");
  • Stream.iterate(): 生成一个无限流,通过迭代生成元素。
Stream<Integer> stream = Stream.iterate(1, n -> n * 2); // 1, 2, 4, 8, ...

使用 Stream.Builder

Stream.Builder 是一个用于逐步构建流的辅助工具。通过 add() 方法逐个添加元素,最后调用 build() 方法生成流.

import java.util.stream.Stream;

public class StreamBuilderExample {
    public static void main(String[] args) {
        Stream.Builder<String> builder = Stream.builder();
        
        builder.add("apple")
               .add("banana")
               .add("orange");
        
        Stream<String> stream = builder.build();
        
        stream.forEach(System.out::println);
    }
}

在上述示例中,我们首先创建了一个 Stream.Builder 对象。然后使用 add() 方法逐个添加水果元素。最后,通过 build() 方法生成流并进行遍历输出。

优势

使用 Stream.Builder 构建流的主要优势在于灵活性。它允许你在构建流的过程中动态地添加元素,适用于那些元素来源不确定或需要动态处理的场景。这种方式相比直接从集合或数组创建流,更加灵活且符合实际应用需求。

从文件创建流

在 Java 8 中,使用 Stream 处理文件数据非常简便。通过 Files.lines() 方法,你可以轻松地将文件的每一行转换为一个流元素,从而对文件内容进行各种操作。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FileToStreamExample {
    public static void main(String[] args) {
        String filePath = "data.txt";
        
        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
            // 对每一行数据进行操作
            lines.filter(line -> line.contains("Java"))
                 .forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们使用 Files.lines() 方法从指定文件中创建了一个流。随后,我们对流进行了过滤,只保留包含 "Java" 的行,并通过终端操作将结果打印出来。

优势

使用 Stream 处理文件数据的优势在于简洁性和可读性。相比传统的读取文件并使用循环遍历的方式,使用 Stream 可以更加清晰地表达数据处理逻辑,减少冗余的代码。

结语

Stream 流为我们提供了一种更加简洁、灵活和函数式的方式来处理集合数据。通过不同的构建方法,我们可以根据不同的数据源和需求创建流,并进行各种操作。这种流式操作的编程方式不仅提高了代码的可读性和可维护性,还能够有效地利用多核处理器进行并行处理,提高程序的性能。希望本篇能够帮助你更好地理解如何基于 Stream 构建流,为数据处理带来更大的便捷和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

docker保存镜像出错

报错&#xff1a;open .docker_temp_801673807: Access is denied. 查询后发现是因为C盘权限问题导致失败&#xff0c;修改保存路径&#xff1a;docker save -o D:\nginx.tar nginx:latest后成功。

解决docker使用pandarallel报错OSError: [Errno 28] No space left on device

参考&#xff1a;https://github.com/nalepae/pandarallel/issues/127 在使用pandarallel报错OSError: [Errno 28] No space left on device&#xff0c;根据上述issue发现确实默认使用的MEMORY_FS_ROOT为 /dev/shm&#xff0c;而在docker环境下这个目录大小只有64M&#xff0…

​嵌入式VS纯软件

嵌入式VS纯软件 嵌入式系统开发与纯软件开发之间存在关键差异&#xff0c;涵盖了硬件依赖性、资源限制、实时性要求、安全性和维护等多个方面。最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#x…

序列中排列存在类dp问题+结合组合数学和拆贡献:1014T4

http://47.92.197.167:5283/contest/412/problem/4 赛时就想到枚举开头来拆贡献。 先说一下&#xff0c;对于A我们不关心具体的值&#xff0c;我们只关心哪些位置相等&#xff0c;哪些位置不等&#xff0c;最后乘上一个系数就行 然后对于序列是否存在排列类问题有个常见的dp套…

【API篇】二、源算子API

文章目录 0、demo数据1、源算子Source2、从集合中读取数据3、从文件中读取4、从Socket读取5、从Kafka读取6、从数据生成器读取数据7、Flink支持的数据类型8、Flink的类型提示&#xff08;Type Hints&#xff09; 0、demo数据 准备一个实体类WaterSensor&#xff1a; Data All…

导航栏参考代码

导航栏参考代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>导航栏参考代码</title> </head> <body> <table width"858" border"0" align"center"><tr&g…

ASO优化之应用评分评论对APP下载量增长的重要性

APP应用评分和评论对于下载转化率的效果是显著的&#xff0c;是ASO优化重要的因素之一。应用评分是对应用性能的衡量预判&#xff0c;而应用评论是用户向应用提供的反馈总结。 1、评分的重要性。 应用评分显示在应用商店的搜索结果&#xff0c;特色页面&#xff0c;热门图表中…

第五十七章 学习常用技能 - 查看Globals

文章目录 第五十七章 学习常用技能 - 查看Globals查看Globals测试查询并查看查询计划 第五十七章 学习常用技能 - 查看Globals 查看Globals 要查看一般Globals&#xff0c;可以使用 ObjectScript ZWRITE 命令或管理门户中的全局页面。如果正在寻找存储类数据的Globals&#x…

docker搭建nginx+php-fpm

docker run --name nginx -p 8898:80 -d nginx:1.20.2-alpine# 将容器nginx.conf文件复制到宿主机 docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf# 将容器conf.d文件夹下内容复制到宿主机 docker cp nginx:/etc/nginx/conf.d /usr/local/nginx/conf…

Linemod算法研究

转载&#xff0c;这篇博客写的比较详细&#xff0c;分析也到位. https://www.cnblogs.com/aoru45/p/16810996.html

Linux查看端口号及进程信息

Linux查看端口号及进程 Linux查看端口号 netstat netstat -tuln显示当前正在监听的端口号以及相关的进程信息 ss ss -tuln与netstat类似&#xff0c;ss也可以用于显示当前监听的端口以及相关信息 isof isof -i :端口号端口号替换为具体要查找的端口号&#xff0c;显示该端…

Mysql数据库 4.图形化界面工具DataGrip

DataGrip工具 选择进入官网安装 ataGrip: The Cross-Platform IDE for Databases && SQL by JetBrains 下载最新版本的可以直接点击 Download 下载&#xff0c;下载其他版本的点击 Other versions 下载其他版本 .选择对应的版本进行下载即可 下载完&#xff0c;得到…

Redis中的BigKey如何发现和处理

文章目录 什么是BigKey?大键的存在通常被认为是不好的,主要原因:常见的bigkey原因: BigKey危害&#xff1f;占用大量内存空间阻塞服务器进程加长持久化时间延长复制时间增加内存碎片加重AOF重写压力降低查找效率 如何发现BigKey&#xff1f;info命令scan命令Redis-cli第三方工…

002数据安全传输-多端协议传输平台:配置Oracle数据库-19c及导入数据信息

002多端协议传输平台&#xff1a;配置Oracle数据库-19c及导入数据信息 文章目录 002多端协议传输平台&#xff1a;配置Oracle数据库-19c及导入数据信息1. 数据库准备2. 导入sql脚本2.1 原版Oracle-11g脚本2.2 新版Oracle-19c脚本2.3 命令行导入脚本 3. 删除系统中数据库信息sql…

在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(二)之LSPosed的使用

上一篇已经安装好LSPosed模块及其Manager管理器&#xff0c;参考文章 在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器&#xff08;一&#xff09;-CSDN博客 安装完成后&#xff0c;在模拟器上出现图标如下&#xff1a; 一、运行LSPosed 二、仓库模块 内容非…

《向量数据库指南》——Milvus Cloud和Elastic Cloud 特性对比

随着以 Milvus 为代表的向量数据库在 AI 产业界越来越受欢迎,诸如 Elasticsearch 之类的传统数据库和检索系统也开始行动起来,纷纷在快速集成专门的向量检索插件方面展开角逐。 例如,在提供类似插件的传统数据库中,Elasticsearch 8.0 首屈一指,推出了包括向量插入和最相似…

蓝桥杯 第 1 场算法双周赛 第1题 三带一 c++ map 巧解 加注释

题目 三带一【算法赛】https://www.lanqiao.cn/problems/5127/learning/?contest_id144 问题描述 小蓝和小桥玩斗地主&#xff0c;小蓝只剩四张牌了&#xff0c;他想知道是否是“三带一”牌型。 所谓“三带一”牌型&#xff0c;即四张手牌中&#xff0c;有三张牌一样&#…

字符串进行 URL 编码处理

// URL_test.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h> #include <stdlib.h> #include <string.h>// 判断字符是否需要进行 URL 编码 static bool needs_encoding(char c) {if ((c &g…

力扣第538题 把二叉搜索树转换为累加树 c++

题目 538. 把二叉搜索树转换为累加树 中等 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值…