Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第七章:Java 8新特性

第七章:Java 8新特性

7.2 Stream API

1. Stream API概述

Stream API是Java 8中引入的一个强大的数据处理工具,它允许开发者以声明式的方式处理集合数据。Stream API的核心思想是将数据源(如集合、数组等)转换为一个流(Stream),然后通过一系列的操作(如过滤、映射、排序等)对数据进行处理,最后通过终止操作得到结果。

Stream API的主要特点包括:

  • 声明式编程:开发者只需关注“做什么”,而不是“怎么做”。
  • 链式调用:多个操作可以串联起来形成一个流水线。
  • 内部迭代:Stream API在内部处理迭代过程,无需显式使用循环。

2. Stream的创建

Stream可以通过多种方式创建:

  • 从集合创建:通过Collection.stream()或Collection.parallelStream()方法。
    List<String> list = Arrays.asList("a", "b", "c");
    Stream<String> stream = list.stream();
    
  • 从数组创建:通过Arrays.stream()方法。
    String[] array = {"a", "b", "c"};
    Stream<String> stream = Arrays.stream(array);
    
  • 使用Stream.of():直接通过值创建Stream。
    Stream<String> stream = Stream.of("a", "b", "c");
    
  • 无限流:通过Stream.iterate()或Stream.generate()方法创建无限流。
    Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1);
    

3. Stream的中间操作

中间操作是对Stream进行处理的步骤,返回一个新的Stream,可以链式调用。常见的中间操作包括:

  • filter(Predicate<T>):过滤符合条件的元素。
    stream.filter(s -> s.startsWith("a"));
    
  • map(Function<T, R>):将元素转换为另一种形式。
    stream.map(String::toUpperCase);
    
  • sorted():对元素进行排序。
    stream.sorted();
    
  • distinct():去除重复元素。
    stream.distinct();
    
  • limit(long):限制流中元素的数量。
    stream.limit(10);
    

4. Stream的终止操作

终止操作会触发流的处理并返回结果。常见的终止操作包括:

  • forEach(Consumer<T>):对每个元素执行操作。
    stream.forEach(System.out::println);
    
  • collect(Collector<T, A, R>):将流转换为集合或其他形式。
    List<String> result = stream.collect(Collectors.toList());
    
  • reduce(BinaryOperator<T>):将流中的元素归约为一个值。
    Optional<String> reduced = stream.reduce((s1, s2) -> s1 + s2);
    
  • count():返回流中元素的数量。
    long count = stream.count();
    
  • anyMatch(Predicate<T>):检查是否有元素满足条件。
    boolean anyMatch = stream.anyMatch(s -> s.equals("a"));
    

5. 并行流

Stream API支持并行处理数据,可以通过parallelStream()方法或parallel()中间操作将流转换为并行流。并行流利用多核处理器提高处理效率。

List<String> list = Arrays.asList("a", "b", "c");
list.parallelStream().forEach(System.out::println);

6. 示例代码

以下是一个完整的Stream API示例,展示如何从集合中过滤、映射并收集结果:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream()
    .filter(name -> name.length() > 4)
    .map(String::toUpperCase)
    .collect(Collectors.toList());
System.out.println(result); // 输出: [ALICE, CHARLIE, DAVID]

7. 注意事项

  • Stream是“一次性”的,一旦被消费(终止操作执行),就不能再次使用。
  • 中间操作是惰性的,只有在终止操作触发时才会执行。
  • 并行流虽然高效,但需要注意线程安全问题。

Stream API极大地简化了集合数据的处理,是Java 8中最重要的新特性之一。通过灵活的组合中间操作和终止操作,可以高效地完成复杂的数据处理任务。

Last Updated:: 3/27/25, 12:55 PM