Java基础 - Stream 流:构建流的多种方式

本文详细介绍了Java8中Stream流的原理、如何从数组、集合、文件和生成器创建Stream流,以及各种构建方式和终端/中间操作,帮助提升代码可读性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stream 流是 Java 8 中引入的一种新的抽象,它可以让你以声明式的方式处理数据集合。Stream 流不是数据结构,而是一种对数据源进行各种操作的视图。Stream 流可以支持串行或并行的执行,提高了代码的可读性和性能。

要使用 Stream 流,首先你需要有一个数据源,比如一个数组、一个集合、一个文件、一个生成器等。然后你可以通过多种方式构建一个 Stream 流对象,对数据源进行转换。最后,你可以对 Stream 流进行终端操作,得到一个结果或者产生一个副作用。

我们将探索构建 Stream 流的多种方式,包括:

  • 从数组或集合构建 Stream 流
  • 从文件或 I/O 构建 Stream 流
  • 从函数生成 Stream 流
  • 从其他 Stream 流构建 Stream 流

从数组或集合构建 Stream 流

如果你有一个数组或一个集合,你可以使用 Arrays.stream()Collection.stream() 方法来构建一个 Stream 流对象。例如:

// 从数组构建 Stream 流
String[] names = {"Alice", "Bob", "Charlie", "David"};
Stream<String> nameStream = Arrays.stream(names);

// 从集合构建 Stream 流
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Stream<Integer> numberStream = numbers.stream();

你也可以使用 Stream.of() 方法来构建一个 Stream 流对象,它可以接受任意数量的参数,或者一个数组。例如:

// 从多个参数构建 Stream 流
Stream<String> colorStream = Stream.of("red", "green", "blue");

// 从一个数组构建 Stream 流
Double[] scores = {98.5, 85.4, 76.3, 92.1};
Stream<Double> scoreStream = Stream.of(scores);

从文件或 I/O 构建 Stream 流

如果你有一个文件或一个 I/O 资源,你可以使用 Files.lines()BufferedReader.lines() 方法来构建一个 Stream 流对象,它们会返回一个由文件或 I/O 资源的每一行组成的 Stream 流对象。例如:

// 从文件构建 Stream 流
Path path = Paths.get("data.txt");
try (Stream<String> lineStream = Files.lines(path)) {
    // 对每一行进行操作
    lineStream.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

// 从 I/O 资源构建 Stream 流
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
    // 从标准输入读取每一行
    Stream<String> inputStream = reader.lines();
    // 对每一行进行操作
    inputStream.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

从函数生成 Stream 流

如果你没有一个现成的数据源,你可以使用 Stream.generate()Stream.iterate() 方法来构建一个 Stream 流对象,它们会根据一个函数来生成一个无限的 Stream 流对象。你可以使用 limit() 方法来限制 Stream 流的大小。例如:

// 使用 generate() 方法构建 Stream 流
// 生成一个随机数的 Stream 流
Stream<Double> randomStream = Stream.generate(Math::random);
// 限制 Stream 流的大小为 10
randomStream.limit(10).forEach(System.out::println);

// 使用 iterate() 方法构建 Stream 流
// 生成一个斐波那契数列的 Stream 流
Stream<Integer> fibonacciStream = Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
        .map(t -> t[0]);
// 限制 Stream 流的大小为 10
fibonacciStream.limit(10).forEach(System.out::println);

从其他 Stream 流构建 Stream 流

如果你已经有一个 Stream 流对象,你可以使用一些中间操作来构建一个新的 Stream 流对象,对原来的 Stream 流进行转换或过滤。例如:

// 从一个 Stream 流构建另一个 Stream 流
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");

// 使用 filter() 方法过滤出长度为 3 的字符串
Stream<String> filteredStream = animalStream.filter(s -> s.length() == 3);
// 输出 [cat, dog, fox]
filteredStream.forEach(System.out::println);

// 使用 map() 方法将字符串转换为大写
Stream<String> mappedStream = animalStream.map(String::toUpperCase);
// 输出 [CAT, DOG, ELEPHANT, FOX, GIRAFFE]
mappedStream.forEach(System.out::println);

// 使用 flatMap() 方法将多个 Stream 流合并为一个
Stream<String> fruitStream = Stream.of("apple", "banana", "cherry");
Stream<String> vegetableStream = Stream.of("carrot", "lettuce", "tomato");
Stream<String> foodStream = Stream.of(fruitStream, vegetableStream).flatMap(s -> s);
// 输出 [apple, banana, cherry, carrot, lettuce, tomato]
foodStream.forEach(System.out::println);

以上就是构建 Stream 流的多种方式的介绍,希望对你有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

--土拨鼠--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值