java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Stream流

Java Stream流从入门到精通(最新整理)

作者:六七_Shmily

Java Stream 是一个来自 java.util.stream 包的抽象概念,它允许你以声明方式处理数据集合(例如 List、Set 等),本文给大家介绍Java Stream流从入门到精通,感兴趣的朋友跟随小编一起看看吧

Stream流,这是一个非常重要的里程碑。它代表了从“命令式编程”向“声明式编程”风格的转变,刚开始不理解是非常正常的。

一、Stream是做什么的?—— “流水线”的比喻

你可以把Stream想象成一条工厂里的流水线

Stream的核心思想是:你只需告诉它“做什么”(What),而不是“怎么做”(How)。

举个例子:有一个数字列表,找出所有偶数,然后求它们的平方,最后收集到一个新列表里。

传统方式(命令式):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenSquares = new ArrayList<>();
for (Integer number : numbers) {
    if (number % 2 == 0) {         // 自己写if判断
        int square = number * number; // 自己计算平方
        evenSquares.add(square);    // 自己添加到新集合
    }
}

Stream方式(声明式):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenSquares = numbers.stream() // 1. 获取流
        .filter(n -> n % 2 == 0)           // 2. “工序”一:过滤偶数
        .map(n -> n * n)                   // 3. “工序”二:映射为平方
        .collect(Collectors.toList());     // 4. “启动”流水线:收集结果

你看,Stream的代码更简洁、更易读,它的每一步操作都像在描述业务逻辑本身。

二、是任何类型都可以使用Stream吗?

不是任何类型本身都能用,但任何类型的【集合】或【数组】几乎都可以转换成Stream来处理。

Stream流本身是一个通用工具,但它不能直接作用于单个对象(比如你有一个String name = "Alice",你不能name.stream())。它的操作对象是数据序列

数据源主要来自以下几个方面:

从集合(Collection)来(最常见)

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> streamFromList = list.stream();
Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));
Stream<Integer> streamFromSet = set.stream();

所有Collection的实现类(List, Set, Queue等)都有.stream()方法。

从数组来

int[] numbers = {1, 2, 3, 4, 5};
IntStream streamFromArray = Arrays.stream(numbers); // 注意是IntStream

使用Arrays.stream(array)静态方法。

使用Stream类的静态方法

Stream<String> streamOfValues = Stream.of("Java", "Python", "C++");
// 创建一个无限的奇数流:1, 3, 5, 7...
Stream<Integer> infiniteStream = Stream.iterate(1, n -> n + 2);

Stream.of(T... values): 直接用值创建流。

Stream.iterate()Stream.generate(): 创建无限流。

从文件等I/O资源来(比如Files.lines()):

try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    lines.forEach(System.out::println);
}

特别注意:基本类型

直接操作基本类型(int, long, double)为了避免装箱拆箱的性能损耗,Java提供了特化的流:IntStream, LongStream, DoubleStream

它们有额外的方法,如sum(), average(), range()等。

所以,结论是:你需要有一个数据序列(通常是集合或数组),然后就可以把它变成Stream来使用。

三、Stream的操作分类:中间操作 vs. 终结操作

这是理解Stream执行机制的关键。Stream的操作分为两大类:

类型特点常见方法返回值
中间操作懒惰的 (Lazy)filter(), map(), sorted(), distinct(), limit()返回一个新的Stream
不会立即执行,只是被记录下來flatMap(), peek()
终结操作积极的 (Eager)collect(), forEach(), count()返回一个非Stream的结果
会触发整个流水线的实际执行findFirst(), anyMatch(), reduce(), min()/max()(如void, List, Optional, int等)

执行原理:只有在调用终结操作时,所有中间操作才会组合成一个“流水线方案”,然后数据源中的元素会逐个地依次通过整个流水线。这种处理方式称为“循环融合”,效率很高,因为它只需要遍历一次集合。

四、常用的Stream操作(“加工工序”)

总结与建议

给你的学习建议

  1. 多练习从ListArray创建流。
  2. 重点掌握filtermapcollect这三个最常用的方法。
  3. 理解每个中间操作都会返回一个新流,但不会触发计算。
  4. 记住,没有终结操作,整个Stream流水线就什么都不会做

到此这篇关于Java Stream流:从入门到精通的文章就介绍到这了,更多相关Java Stream流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文