Java Stream API详解与使用

简介: Java Stream API是Java 8引入的特性,提供函数式操作处理集合,支持链式操作和并行处理,提升代码可读性和性能。关键点包括:延迟执行的中间操作(如filter, map)和触发计算的终端操作(如collect, forEach)。示例展示了如何从Person列表过滤出年龄大于20的姓名并排序。使用Stream时注意避免中间操作的副作用,终端操作后Stream不能复用,以及并行操作的线程安全性。

Java Stream API 是Java 8引入的一个重要特性,它为集合对象提供了函数式操作,使得对集合数据的处理变得高效且易于理解。Stream API 支持链式操作,允许以声明性的方式处理数据,而无需显式地写出迭代循环。以下是Java Stream API的几个关键点和使用示例:

Java Stream API简介

1.什么是Stream?

  • Stream 不是集合,而是一种数据处理的抽象,它代表了可能的计算操作序列。Stream可以并行处理,充分利用多核处理器的优势。

2.Stream的两种类型

  • 中间操作(Intermediate operations):这类操作会返回一个新的Stream,允许进一步的操作链式调用,如 filter, map。中间操作是延迟执行的。
  • 终端操作(Terminal operations):这类操作会触发实际计算,产生结果或副作用,如 collect, forEach, count,执行后Stream不能再被使用。

3.优势

  • 提高代码可读性和简洁性。
  • 支持并行处理,提高性能。
  • 函数式编程风格,易于理解和维护。

常用的Stream API方法

中间操作

  1. filter(Predicate): 过滤出满足条件的元素。
  2. map(Function): 对每个元素应用函数进行转换。
  3. sorted(Comparator): 对元素排序。
  4. distinct(): 去重,基于对象的equals和hashCode方法。
  5. peek(Consumer): 对每个元素执行操作并返回新的Stream(主要用于调试)。

终端操作

  1. collect(Collector): 将Stream转换为另一种形式,如列表、集合或聚合结果。
  2. forEach(Consumer): 对每个元素执行操作,无返回值。
  3. reduce(BinaryOperator): 将Stream元素累积成一个值,如求和、求最大值。
  4. anyMatch(Predicate): 检查是否至少有一个元素满足条件。
  5. allMatch(Predicate): 检查所有元素是否都满足条件。
  6. noneMatch(Predicate): 检查没有元素满足条件。
  7. findFirst(): 返回第一个元素的Optional。
  8. limit(long): 限制Stream中的元素数量。
  9. skip(long): 跳过Stream开始的N个元素。

使用示例

假设有一个Person对象列表,我们要找出年龄大于20岁的人的名字,并按字母顺序排序。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Person {
   
    String name;
    int age;

    // 构造方法、getter和setter省略
}

public class StreamExample {
   
    public static void main(String[] args) {
   
        List<Person> people = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Charlie", 22)
        );

        List<String> names = people.stream()
                .filter(person -> person.getAge() > 20) // 过滤年龄大于20的
                .map(Person::getName) // 提取名字
                .sorted() // 排序
                .collect(Collectors.toList()); // 收集到列表

        System.out.println(names); // 输出:[Alice, Bob]
    }
}

注意事项

  • 在使用Stream时,应避免在中间操作中引入非功能性副作用,因为这可能会导致不可预测的行为。
  • 终端操作执行后,Stream管道将关闭,不能再被重复使用。
  • 并行Stream操作时,确保操作是线程安全的,特别是当操作影响外部状态时。
相关文章
|
4月前
|
Java API
详细解释一下Stream API中的sorted操作
详细解释一下Stream API中的sorted操作
279 1
|
4月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
416 114
|
4月前
|
Java API
深入理解Java Stream API:告别繁琐循环
深入理解Java Stream API:告别繁琐循环
309 104
|
4月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
223 1
|
5月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
5月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
324 100
|
5月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
344 101
|
5月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
293 101
|
Java
Java8中stream流处理数据21个小案例(学习使用)
Java8中stream流处理数据21个小案例(学习使用)
204 0
|
SQL 存储 前端开发
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
343 0
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!

热门文章

最新文章