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.mzph.cn/web/66418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服 根据上一步的步骤&#xff0c;已经调试了ONE API的接口&#xff0c;下面&#xff0c;我们就登陆fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 这个就是你的fastGPT后台地址&#xff0c;可以在configer文件中找到。 账号是…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

【王树森搜索引擎技术】相关性02:评价指标(AUC、正逆序比、DCG)

相关性的评价指标 Pointwise评价指标&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise评价指标&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise评价指标&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置

下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…

wx030基于springboot+vue+uniapp的养老院系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外&#xff0c;整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口&#xff0c;用于模拟pc网段&#xff1b;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…

SSM课设-酒店管理系统功能设计

【课设者】SSM课设-酒店管理系统 分为用户端管理员端 技术栈: 后端: Spring Spring MVC MyBatis Mysql JSP 前端: HtmlCssJavaScriptAjax 功能: 用户端主要功能包括&#xff1a; 登录注册 客房预订 客房评论 首页 管理员端主要功能包括&#xff1a; 会员信息管理 客房信息…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…