Java Stream API详解与使用

本文涉及的产品
视觉智能开放平台,图像资源包5000点
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 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操作时,确保操作是线程安全的,特别是当操作影响外部状态时。
相关文章
|
1天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
14 4
|
10天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
1月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
35 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
1月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
21 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
16天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
30天前
|
存储 Java API
如何使用 Java 中的 API 更改 PDF 纸张大小
如何使用 Java 中的 API 更改 PDF 纸张大小
38 11
|
30天前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
36 10
|
29天前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
25 1
|
1月前
|
存储 Java 数据处理
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
28 1
|
23天前
|
SQL Java API
深入探索Java的持久化技术——JPA(Java Persistence API)
【10月更文挑战第10天】深入探索Java的持久化技术——JPA(Java Persistence API)
15 0