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
  • 并行流适用于数据量较大的场景,但在小数据集下可能会由于线程管理的开销而降低性能。因此,是否使用并行流需要根据具体情况判断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955874.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…

Leetcode - 周赛432

目录 一、3417. 跳过交替单元格的之字形遍历二、3418. 机器人可以获得的最大金币数三、3419. 图的最大边权的最小值四、3420. 统计 K 次操作以内得到非递减子数组的数目 一、3417. 跳过交替单元格的之字形遍历 题目链接 本题是一道模拟题&#xff0c;第一行走0&#xff0c;2&…

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…

探索与创作:2024年CSDN平台上的成长与突破

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN&#xff1a;编程新手的避风港初学者的福音&#xff1a;细致入微的知识讲解考试复习神器&#xff1a;技术总结的“救命指南”曾经的自己&#xff1a;为何迟迟不迈出写博客的第一步兴趣萌芽&#xff1a;从“读”到“想写”的初体验…

CSS中样式继承+优先级

继承属性和非继承属性 一、定义及分类 1、继承属性是指在父元素上设置了这些属性后&#xff0c;子元素会自动继承这些属性的值&#xff0c;除非子元素显式地设置了不同的值。 常见的继承属性: 字体 font 系列文本text-align text-ident line-height letter-spacing颜色 col…

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件&#xff0c;发现很多都已经使用JDK17springboot3 了&#xff0c;之前的JDK8已经被替换下场&#xff0c;所以今天就在本机安装了JDK17&#…

ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT

文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史&#xff1a;从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …

vector迭代器的使用以及迭代器失效

一、iterator的使用注意 begin与end 遵循左闭右开的原则&#xff0c;begin 指向vector的第一个元素&#xff0c;end 指向vector的最后一个元素的往下一个位置。 rbegin 与 rend rbegin指向最后一个元素的位置&#xff0c;rend指向第一个元素的往前一个位置。 二、vector的常…

【Linux】15.Linux进程概念(4)

文章目录 程序地址空间前景回顾C语言空间布局图&#xff1a;代码1代码2代码3代码4代码5代码6代码7 程序地址空间前景回顾 历史核心问题&#xff1a; pid_t id fork(); if(id 0) else if(id>0) 为什么一个id可以放两个值呢&#xff1f;之前没有仔细讲。 C语言空间布局图&am…

【无法下载github文件】虚拟机下ubuntu无法拉取github文件

修改hosts来进行解决。 步骤一&#xff1a;打开hosts文件 sudo vim /etc/hosts步骤二&#xff1a;查询 github.com的ip地址 https://sites.ipaddress.com/github.com/#ipinfo将github.com的ip地址添加到hosts文件末尾&#xff0c;如下所示。 140.82.114.3 github.com步骤三…

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

Android系统开发(十):标准协议和通讯的桥梁:探索蓝牙、NFC、WLAN 的工作原理

引言&#xff1a; 现代社会已经是信息互联的世界&#xff0c;各种设备之间的互联互通已经成为了生活的一部分。而在这个过程中&#xff0c;Android 设备与其他硬件之间的通信扮演着至关重要的角色。从蓝牙耳机到 WiFi 路由器&#xff0c;甚至与电话功能的互动&#xff0c;所有…

node中文名的js文件有问题

新版Node无法运行含有中文名的JS文件&#xff0c;具体表现在无报错无反应。如下图&#xff1a; 源码如下&#xff1a; 改成英文的JS文件&#xff0c;则正常&#xff0c;如下图&#xff1a;

BERT与CNN结合实现糖尿病相关医学问题多分类模型

完整源码项目包获取→点击文章末尾名片&#xff01; 使用HuggingFace开发的Transformers库&#xff0c;使用BERT模型实现中文文本分类&#xff08;二分类或多分类&#xff09; 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…

openharmony应用开发快速入门

开发准备 本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用&#xff08;如下图所示&#xff09;&#xff0c;快速了解工程目录的主要文件&#xff0c;熟悉OpenHarmony应用开发流程。 在开始之前&#xff0c;您需要了解有关OpenHarmon…

RabbitMQ---TTL与死信

&#xff08;一&#xff09;TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL&#xff0c;当消息到达过期时间还没有被消费时就会自动删除 注&#xff1a;这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身&#xff0c;不是说队列过期时间…

51.WPF应用加图标指南 C#例子 WPF例子

完整步骤&#xff1a; 先使用文心一言生成一个图标如左边使用Windows图片编辑器编辑&#xff0c;去除背景使用正方形&#xff0c;放大图片使图标铺满图片使用格式工程转换为ico格式&#xff0c;分辨率为最大 在资源管理器中右键项目添加ico类型图片到项目里图片属性设置为始终…

多语言插件i18n Ally的使用

先展示一下效果 1.第一步首先在vscode下载插件 2.第二步在 setting.json 里面配置 要区分文件是js&#xff0c;ts或json结尾 以zh.ts和en.ts结尾的用这个 { "i18n-ally.localesPaths": ["src/locales"],"i18n-ally.keystyle": "nested"…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树&#xff0c;对于树中的每个结点&#xff0c;如果该结点的权值大于等于孩子结点的权值&#xff0c;就称它为大根堆&#xff0c;小于等于就叫小根堆&#xff0c;如果是大根堆&#xff0c;每个子树也是符合大根堆的特征的&#xff0c;如果是…

【人工智能】:搭建本地AI服务——Ollama、LobeChat和Go语言的全方位实践指南

前言 随着自然语言处理&#xff08;NLP&#xff09;技术的快速发展&#xff0c;越来越多的企业和个人开发者寻求在本地环境中运行大型语言模型&#xff08;LLM&#xff09;&#xff0c;以确保数据隐私和提高响应速度。Ollama 作为一个强大的本地运行框架&#xff0c;支持多种先…