当前位置: 首页 > article >正文

Java 8 Stream API

文章目录

  • Java 8 Stream API
  • 1. Stream
  • 2. Stream 的创建
  • 3. 常见的 Stream 操作
    • 3.1 中间操作
    • 3.2 终止操作
  • 4. Stream 的并行操作

Java 8 Stream API

  • Java 8 引入了 Stream API,使得对集合类(如 ListSet 等)的操作变得更加简洁和直观。Stream API 主要目的是为了简化对集合数据的处理,尤其是支持 函数式编程 风格的操作。
  • Stream 可以让你使用声明式的方式进行集合操作,而不是传统的命令式方式。

1. Stream

  • 在 Java 8 中,Stream 是一个用于处理数据集合(如 ListSetMap 等)的工具,它允许你在不修改集合本身的情况下,通过一系列的操作(如过滤、映射、聚合等)来对数据进行处理。
  • Stream 是一个流式的、单向的数据结构,意味着你一次只能处理流中的一个元素,且每次处理后的流会产生新的流对象,原始流不会发生改变。

2. Stream 的创建

Stream 可以通过以下几种方式创建:

  • 从集合创建 Stream

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    Stream<String> stream = list.stream();
    
  • 从数组创建 Stream

    String[] array = {"apple", "banana", "cherry"};
    Stream<String> stream = Arrays.stream(array);
    
  • 使用 Stream.of() 创建 Stream

    Stream<String> stream = Stream.of("apple", "banana", "cherry");
    

3. 常见的 Stream 操作

  • Stream API 提供了两类操作:中间操作终止操作

3.1 中间操作

  • 中间操作是惰性操作(Lazy),它们不会立即执行,直到你触发一个终止操作时,才会开始执行整个流的计算。常见的中间操作包括:

  • filter:用于过滤流中的元素,返回符合条件的元素。

    List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
    List<String> filteredList = list.stream()
                                    .filter(s -> s.startsWith("a"))
                                    .collect(Collectors.toList());
    System.out.println(filteredList); // 输出: [apple]
    
  • map:用于将流中的元素通过函数转换成另一个类型的元素(通常是映射操作)。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    List<String> upperCaseList = list.stream()
                                     .map(String::toUpperCase)
                                     .collect(Collectors.toList());
    System.out.println(upperCaseList); // 输出: [APPLE, BANANA, CHERRY]
    
  • distinct:去除重复的元素。

    List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");
    List<String> distinctList = list.stream()
                                    .distinct()
                                    .collect(Collectors.toList());
    System.out.println(distinctList); // 输出: [apple, banana, cherry]
    
  • sorted:对流中的元素进行排序。

    List<String> list = Arrays.asList("banana", "apple", "cherry");
    List<String> sortedList = list.stream()
                                  .sorted()
                                  .collect(Collectors.toList());
    System.out.println(sortedList); // 输出: [apple, banana, cherry]
    
  • flatMap:将流中的每个元素映射成多个元素,然后再将所有这些元素合并成一个流。

    List<List<String>> listOfLists = Arrays.asList(
        Arrays.asList("apple", "banana"),
        Arrays.asList("cherry", "date"));
    
    List<String> flatMappedList = listOfLists.stream()
                                             .flatMap(List::stream)
                                             .collect(Collectors.toList());
    System.out.println(flatMappedList); // 输出: [apple, banana, cherry, date]
    

3.2 终止操作

终止操作是激活流计算的操作,调用终止操作时流会开始遍历并进行计算。常见的终止操作包括:

  • collect:将流中的元素收集到集合中,是最常用的终止操作。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    List<String> result = list.stream()
                              .collect(Collectors.toList());
    System.out.println(result); // 输出: [apple, banana, cherry]
    
  • forEach:对流中的每个元素进行操作,通常用于打印。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    list.stream()
        .forEach(System.out::println);
    // 输出:
    // apple
    // banana
    // cherry
    
  • reduce:用于对流中的元素进行累加或合并,通常用于求和、求最小值或求最大值。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.stream()
                     .reduce(0, Integer::sum);
    System.out.println(sum); // 输出: 15
    
  • anyMatch:检查流中的任何一个元素是否符合指定的条件。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    boolean hasApple = list.stream()
                           .anyMatch(s -> s.equals("apple"));
    System.out.println(hasApple); // 输出: true
    
  • allMatch:检查流中的所有元素是否符合指定的条件。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    boolean allStartWithA = list.stream()
                                .allMatch(s -> s.startsWith("a"));
    System.out.println(allStartWithA); // 输出: false
    
  • count:计算流中元素的数量。

    List<String> list = Arrays.asList("apple", "banana", "cherry");
    long count = list.stream()
                     .count();
    System.out.println(count); // 输出: 3
    

4. Stream 的并行操作

  • Stream 还提供了并行流,它可以将计算任务分配给多个线程以加速处理。在调用 parallel() 方法后,流的操作会在多个线程中并行执行,从而提高大数据量处理的性能。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.parallelStream()
                 .reduce(0, Integer::sum);
System.out.println(sum); // 输出: 21
  • 并行流适用于数据量较大的场景,但在小数据集下可能会由于线程管理的开销而降低性能。因此,是否使用并行流需要根据具体情况判断。

http://www.kler.cn/a/509804.html

相关文章:

  • 【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格
  • 利用 LNMP 实现 WordPress 站点搭建
  • OODA循环在网络安全运营平台建设中的应用
  • QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能
  • npm ERR! code CERT_HAS_EXPIRED
  • PG vs MySQL mvcc机制实现的异同
  • C++ macro: Variadic macros (可变参数宏)
  • ArkUI概述
  • idea中远程调试中配置的参数说明
  • 3,Linux文件与目录管理命令及其参数(基于Ubuntu示例进行讲解)
  • SOA(面向服务架构)全面解析
  • 合格的前端,使用xlsx
  • 蓝桥杯真题 - 公因数匹配 - 题解
  • 【LLM】Openai-o1及o1类复现方法
  • 《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
  • vue | 插值表达式
  • K近邻算法实战——电影分类算法
  • 迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...
  • QQ邮箱登录逆向
  • 前端包管理工具npm、pnpm 和 Yarn 的总结对比
  • Python爬虫(5) --爬取网页视频
  • C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14
  • 机器学习中的方差与偏差
  • Kubernetes (K8s) 入门指南
  • rocketmq集群启动和下线
  • 花诗蕾奇亚籽抹茶代餐粉和固态速溶茶,YYDS!