Java流式编程

一、流的基础概念

  1. 流(Stream)

    • 定义:流是一种可以在数据集合上进行操作的抽象化序列,它没有存储数据的能力,而是通过一系列的操作来处理数据。
    • 特性
      • 无存储:流不存储数据,只是数据的"视图"。
      • 函数式编程:流的操作采用函数式编程风格。
      • 惰性求值:中间操作是惰性求值的,直到遇到终端操作才会真正执行。
      • 链式操作:流的中间操作可以链式调用,形成处理管道。
  2. 流的类型

    • 顺序流:按顺序处理数据。
    • 并行流:利用多核处理器并行处理数据。

二、流的创建

流可以从多种数据源创建,常见的方法有:

  1. 从集合创建流

    复制代码
    List<String> list = Arrays.asList("apple", "banana", "cherry");
    Stream<String> stream = list.stream();
  2. 从数组创建流

    复制代码
    String[] array = {"apple", "banana", "cherry"};
    Stream<String> stream = Arrays.stream(array);
  3. 使用 Stream.of() 方法

    复制代码
    Stream<String> stream = Stream.of("apple", "banana", "cherry");
  4. 生成无限流

    复制代码
    Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2); // 生成一个无限递增的流

三、流的操作

流操作分为两类:中间操作和终端操作。

  1. 中间操作:返回一个新的流,不会立刻执行,主要用于处理数据。常见的中间操作有:

    • 过滤(Filter)

      复制代码
      Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
    • 映射(Map)

      复制代码
      Stream<String> upperCaseStream = stream.map(String::toUpperCase);
    • 排序(Sorted)

      复制代码
      Stream<String> sortedStream = stream.sorted();
  2. 终端操作:触发流的计算并生成结果。常见的终端操作有:

    • 遍历(ForEach)

      复制代码
      stream.forEach(System.out::println);
    • 收集(Collect)

      复制代码
      List<String> resultList = stream.collect(Collectors.toList());
    • 计数(Count)

      复制代码
      long count = stream.count();

四、流式编程的示例

下面是一个示例,展示了如何使用流来处理一个字符串列表,进行过滤、映射、排序,并最终收集结果:

复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        // 创建一个包含字符串的列表
        List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");

        // 创建流并进行一系列处理操作
        List<String> result = fruits.stream()
                                    .filter(fruit -> fruit.length() > 4) // 过滤长度大于4的水果
                                    .map(String::toUpperCase)           // 将所有水果名称转换为大写
                                    .sorted()                           // 对结果进行排序
                                    .collect(Collectors.toList());      // 收集结果到列表中

        // 打印结果
        System.out.println(result); // 输出: [BANANA, CHERRY]
    }
}

五、流的性能考虑

  1. 惰性求值:中间操作是惰性求值的,只有在遇到终端操作时才会执行。因此,可以将多个中间操作链式组合,避免不必要的计算。

  2. 并行流 :通过 parallelStream() 方法可以创建并行流,利用多核处理器提高性能。但并行流的性能提升依赖于数据集的大小和操作的复杂性,使用时需要评估性能开销。

    复制代码
    List<String> result = fruits.parallelStream()
                                .filter(fruit -> fruit.length() > 4)
                                .map(String::toUpperCase)
                                .sorted()
                                .collect(Collectors.toList());

六、总结

Java 流式编程通过简洁的 API 提供了高效、可读性强的数据处理方式。理解流的创建、操作和性能特点,能够帮助开发者更好地利用流式编程解决实际问题。

相关推荐
2601_94980959几秒前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
猷咪22 分钟前
C++基础
开发语言·c++
IT·小灰灰24 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧25 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q26 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳026 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾26 分钟前
php 对接deepseek
android·开发语言·php
vx_BS8133030 分钟前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_9498683630 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计44 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识