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


    当我们处理集合数据时,往往需要对其进行各种操作,如过滤、映射、排序、归约等。在 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() 方法从文件中创建流,每行都是流中的一个元素。

    从集合创建流

    1. import java.util.Arrays;
    2. import java.util.List;
    3. import java.util.stream.Stream;
    4. public class CollectionToStreamExample {
    5. public static void main(String[] args) {
    6. List fruits = Arrays.asList("apple", "banana", "orange", "grape", "kiwi");
    7. Stream stream = fruits.stream();
    8. // 对流进行操作,例如过滤、映射、归约等
    9. stream.filter(fruit -> fruit.length() > 5)
    10. .map(String::toUpperCase)
    11. .forEach(System.out::println);
    12. }
    13. }

    从数组创建流

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

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

    静态工厂方法

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

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

    使用 Stream.Builder

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

    1. import java.util.stream.Stream;
    2. public class StreamBuilderExample {
    3. public static void main(String[] args) {
    4. Stream.Builder builder = Stream.builder();
    5. builder.add("apple")
    6. .add("banana")
    7. .add("orange");
    8. Stream stream = builder.build();
    9. stream.forEach(System.out::println);
    10. }
    11. }

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

    优势

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

    从文件创建流

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

    1. import java.io.IOException;
    2. import java.nio.file.Files;
    3. import java.nio.file.Paths;
    4. import java.util.stream.Stream;
    5. public class FileToStreamExample {
    6. public static void main(String[] args) {
    7. String filePath = "data.txt";
    8. try (Stream lines = Files.lines(Paths.get(filePath))) {
    9. // 对每一行数据进行操作
    10. lines.filter(line -> line.contains("Java"))
    11. .forEach(System.out::println);
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }

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

    优势

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

    结语

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

  • 相关阅读:
    Redis基础
    Ubuntu软件包升级失败的终极修复方法
    基于javaweb的ssm学校教务管理系统(管理员,教师,学生)
    DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(中)
    【ARM AMBA AXI 入门 13 -- AXI 协议中 RRESP 信号详细介绍】
    Linux 权限
    15.镜像安全-镜像加密
    家政小程序源码家政预约小程序独立版,家政上门预约,功能强大
    天眼查最新方式工商信息爬取(公开信息)
    Android平台GB28181设备接入模块相关博客概览
  • 原文地址:https://blog.csdn.net/weixin_48890074/article/details/133824337