首页 > 编程语言 >探索 Java 8 中的 Stream 流:构建流的多种方式

探索 Java 8 中的 Stream 流:构建流的多种方式

时间:2023-11-06 11:38:07浏览次数:32  
标签:Java Stream stream java 创建 构建 import public

当我们处理集合数据时,往往需要对其进行各种操作,如过滤、映射、排序、归约等。在 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);
    }
}

在上述示例中,通过 fruits.stream() 方法我们创建了一个包含水果的流。随后,我们对流进行了过滤(保留长度大于 5 的水果)、映射(转换成大写)和终端操作(打印结果)。

从数组创建流

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.generate(): 生成一个无限流,通过提供的 Supplier 生成元素。
Stream<Double> stream = Stream.generate(Math::random); // 0.123..., 0.456..., ...

*使用 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 构建流,为数据处理带来更大的便捷和效率。

标签:Java,Stream,stream,java,创建,构建,import,public
From: https://blog.51cto.com/u_14129797/8202912

相关文章

  • 带你理解 Java 8 的函数式接口使用和自定义
    函数式接口是Java8引入的一种接口,用于支持函数式编程。函数式接口通常包含一个抽象方法,可以被Lambda表达式或方法引用所实现。在本文中,我们将深入探讨函数式接口的概念、用途以及如何创建和使用函数式接口。什么是函数式接口函数式接口是只包含一个抽象方法的接口。但是默认方......
  • 云图说|分钟级构建业务大屏——Astro大屏应用
    Astro大屏应用(AstroCanvas)是Astro轻应用提供的可视化页面构建服务,服务提供了丰富的可视化组件、灵活的数据接入和多种方式页面构建能力,支持多屏适配,帮助开发者快速构建和发布专业水准的实时可视化应用。通过AstroCanvas一站式数据可视化开发,可分钟级构建业务大屏、小屏页面。通过......
  • 解锁多核处理器的力量:探索数据并行化在 Java 8 Stream 中的应用
    在Java8中引入的Stream为集合数据的处理带来了现代化的方式,而数据并行化则进一步提升了处理速度,充分发挥了多核处理器的优势。本篇博客将详细介绍数据并行化在Java8Stream中的应用,以及如何利用并行流处理大量数据。什么是数据并行化数据并行化是指将任务分解成多个子任务,......
  • Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座
    摘要:本文整理自阿里云开源大数据表存储团队负责人,阿里巴巴高级技术专家李劲松(之信),在StreamingLakehouseMeetup的分享。内容主要分为四个部分:流计算邂逅数据湖PaimonCDC实时入湖Paimon不止CDC入湖总结与生态一、流计算邂逅数据湖流计算1.0实时预处理流计算1.0架构截止......
  • 使用Github Actions构建Docker image
    需求因为网络和性能的原因,有些Dockerfile无法在本地顺利构建。我们可以借助GithubActions每月2000分钟的免费时间来构建。实现在你的仓库里放好Dockerfile如果需要安装文件等操作也一并push建立.github/workflows/main.yml描述任务name:DockerImageCIon:push:......
  • Java 获取自定义注解 字段值 及 注解值
    自定义注解packagecom.jianmu.bean.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/**[email protected]......
  • java随机数
    在Java中生成随机数可以使用java.util.Random类或者java.lang.Math类的静态方法,也可以使用Java8引入的java.util.concurrent.ThreadLocalRandom类。参考文章:java怎么产生随机数使用java.util.Random类:importjava.util.Random;publicclassMain{publicstaticvoid......
  • java数组最大值
    参考文章:java数组求最大值在Java中,你可以通过遍历数组元素来找到数组中的最大值。以下是两种常见的方法:使用循环遍历数组publicclassMain{publicstaticvoidmain(String[]args){int[]array={10,5,8,2,7};//假设数组的第一个元素是最大......
  • Shell系列---【常用脚本之---java启动脚本:run.sh】
    run.sh#!/bin/sh-lapplication=node_exporterPORT=1888CUR_IP=${hostname-I|awk'{print$1}'}command="/opt/app/middles/node_exporter/node_exporter--web.listen-address=:$PORT"#停止stop(){ echo"=============================......
  • Java设计模式之桥接模式
    桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。假如你有一个几何形状(Shape)类,从它能扩展出两个子类:圆形(Circle)和方形(Square)。你希望对这样的类层次结构进行扩展以使其包含颜色,所......