【JAVA】java 中的Stream 常用函数

news2025/1/16 15:43:20

java 中的Stream 常用函数

    • 一、简介
      • 1.1、什么是Stream?
      • 1.2、创建Stream
      • 1.3、Stream的特性
    • 二、Stream的操作
      • 2.1、中间操作:
      • 2.2、终端操作:
      • 2.3、Stream的并行处理
    • 三、Stream 常用函数
    • 四、使用示例
      • 4.1、计算集合中偶数的平方和:
      • 4.2、查找集合中最大值:

一、简介

Java中的Stream是一种用于处理集合元素的工具,它提供了一种流式操作的方式,可以轻松地对集合进行过滤、映射、聚合等操作,以及进行并行处理。以下是关于Java中Stream的详细讲解:

1.1、什么是Stream?

Stream是Java 8引入的一种新的抽象概念,它代表了一种数据元素的序列。
Stream不是数据结构,而是数据元素的流水线,可以进行一系列的操作来处理这些元素。

1.2、创建Stream

可以通过集合类的stream()方法或parallelStream()方法来创建一个流。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
Stream<Integer> parallelStream = numbers.parallelStream();

1.3、Stream的特性

  • 无存储:Stream不是数据结构,它不会在内存中保存数据,而是对源数据进行操作。
  • 惰性求值:Stream的操作是延迟执行的,只有在需要结果时才会执行。
  • 并行处理:Stream可以并行处理元素,提高处理效率。

二、Stream的操作

2.1、中间操作:

对流进行转换、过滤等操作,并返回一个新的流。中间操作是惰性求值的,只有遇到终端操作时才会执行。

Stream<Integer> filteredStream = stream.filter(x -> x % 2 == 0);
Stream<Integer> mappedStream = stream.map(x -> x * x);

2.2、终端操作:

对流进行最终的处理,并产生一个最终的结果。终端操作会触发中间操作的执行。

long count = stream.count();
Optional<Integer> max = stream.max(Integer::compareTo);
stream.forEach(System.out::println);

2.3、Stream的并行处理

Stream提供了并行处理的能力,可以通过parallel()方法将顺序流转换为并行流,加快处理速度。

Stream<Integer> parallelStream = numbers.parallelStream();

三、Stream 常用函数

流(Stream)类型在Java中提供了许多函数,用于对流进行各种操作和处理。以下是一些常用的流类型函数:

  • max :方法找到流中的最大值。

     List<Integer> numbers = Arrays.asList(1, 3, 7, 2, 9, 4, 6);
            
            Optional<Integer> max = numbers.stream()
                                           .max(Integer::compareTo);
            
            if (max.isPresent()) {
                System.out.println("最大值是:" + max.get());
            } else {
                System.out.println("列表为空,没有最大值。");
            }
    

    在这里插入图片描述

  • map:对流中的每个元素应用一个函数,并将结果映射到新的流中。

    Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
    Stream<Integer> squaredNumbers = numbers.map(x -> x * x);
    
  • forEach:对流中的每个元素执行指定操作。在这里插入图片描述

  • filter:根据指定条件过滤流中的元素。

    Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
    Stream<Integer> evenNumbers = numbers.filter(x -> x % 2 == 0);
    

    在这里插入图片描述

  • collect:将流中的元素收集到一个集合中。

    Stream<String> words = Stream.of("hello", "world");
    List<String> wordList = words.collect(Collectors.toList());
    

    在这里插入图片描述

  • reduce:将流中的元素组合成单个结果。

    Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
    Optional<Integer> sum = numbers.reduce((x, y) -> x + y);
    

    在这里插入图片描述

  • flatMap:将多个流合并成一个流。

    List<List<Integer>> listOfLists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
    Stream<Integer> flattenedStream = listOfLists.stream().flatMap(Collection::stream);
    

    在这里插入图片描述

  • sorted:对流中的元素进行排序。

    Stream<Integer> numbers = Stream.of(5, 3, 1, 4, 2);
    Stream<Integer> sortedNumbers = numbers.sorted();
    

    在这里插入图片描述

  • limit:限制流中元素的数量。

    Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
    Stream<Integer> limitedNumbers = numbers.limit(3);
    

    在这里插入图片描述

  • skip:跳过流中的前几个元素。

    Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
    Stream<Integer> skippedNumbers = numbers.skip(2);
    
  • distinct:去除流中重复的元素。

    Stream<Integer> numbers = Stream.of(1, 2, 1, 3, 2, 4);
    Stream<Integer> distinctNumbers = numbers.distinct();
    

这些函数可以组合使用,以实现复杂的数据处理和转换操作。使用流类型函数可以简化代码并提高代码的可读性和可维护性。

四、使用示例

4.1、计算集合中偶数的平方和:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sumOfEvenSquares = numbers.stream()
                               .filter(x -> x % 2 == 0)
                               .mapToInt(x -> x * x)
                               .sum();

4.2、查找集合中最大值:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = numbers.stream()
                                .max(Integer::compareTo);

Stream提供了一种简洁而强大的数据处理方式,可以大大减少代码量并提高代码的可读性和可维护性。

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

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

相关文章

新手也能学会的甘特图制作教程

甘特图是什么&#xff1f; 甘特图(Gantt Chart)是一种以图表形式直观展示项目计划的工具,由20世纪初的管理学家亨利甘特(Henry Gantt)发明并命名。它具有以下几个主要特点: 水平时间轴 甘特图的横轴是一条时间轴,通常按天、周或月来刻度,直观展示了项目从开始到结束的整个时间…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测&#xff1b; 2.输入7个特征&#xf…

考研日常记录(upd 24.4.24)

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 文章目录 2024.4.18 周四课程情况&#xff1a;时间规划&#xff1a; 2024.4.19 周五课程情况&#xff1a;时间规划&#xff1a; 2024.4.20 周六2024.4.2…

Java知识总结---并发篇

线程 线程的状态 Java中线程可以有如下6中状态&#xff1a; NEW 新创建 RUNNABLE 可运行 BLOCKED 阻塞 WAITING 等待 TIMED WAITING 计时等待 TERMINATED 终止 线程的创建 &#xff08;1&#xff09;继承Thread类 public class ExtendsThread extends Thread { O…

学习Docker笔记

在23号刚刚学完新版本的docker还想说回去继续学习老版本的springcloud课程里面的docker 结果一看黑马首页新版本课程出了&#xff0c;绷不住了。以下是我学习新版本docker的笔记&#xff0c;记录了我学习过程遇到的各种bug和解决&#xff0c;也参考了黑马老师的笔记&#xff1a…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3&#xff1a;Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月23日&#xff0c;微软发布Phi-3&#xff0c;这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点&#xff1a;小语言模型(SLM)尽管规模不大&#xff0c;但在语言理解、代码…

three.js 制作卡牌正反面 旋转

1.效果图 2.代码 <template><div><div id"container"></div></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.…

C语言指针进阶:各类型指针变量详解

目录 1. 字符指针变量2. 数组指针变量2.1 什么是数组指针变量2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 代码分析4.3.1 typedef 关键字 5. 函数指针数组6. 转移表 正文开始。 1. 字符指针变量 我们可以…

融合算法:引力融合

问题&#xff1a; 有一批数据&#xff0c;如&#xff1a; [ 1, 2, 3, 45, 46, 55, 89, 101 ]想把它分成3块&#xff0c;如&#xff1a; [1, 2, 3] [45, 46, 55] [89, 101]算法&#xff1a; 参考万有引力公式&#xff0c;想象坐标轴上这8个点的分布&#xff1a; 每一个点都会…

偏执型人格的症状和起因,偏执型人格测试和应对方法

偏执型人格&#xff0c;主打一个敏感多疑&#xff0c;过分的固执&#xff0c;过度的警觉。无论别人怎么解析&#xff0c;都难以说服。偏执型人格常常毫无根据的怀疑他人的忠诚&#xff08;动机&#xff09;&#xff0c;曲解别人的言语&#xff08;或行为&#xff09;&#xff0…

MySQL--表的操作

目录 创建表 查看表结构 修改表 新增列 修改列类型 修改列名 修改表名&#xff1a; 删除列 删除表 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引…

数据结构 - 顺序表

一. 线性表的概念 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的&#xff0c;通过一个问题例子&#xff1a; 问题…

每日OJ题_BFS解决拓扑排序③_力扣LCR 114. 火星词典

目录 力扣LCR 114. 火星词典 解析代码 力扣LCR 114. 火星词典 LCR 114. 火星词典 难度 困难 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已…

[Java EE] 多线程(三):线程安全问题(上)

1. 线程安全 1.1 线程安全的概念 如果多线程环境下代码运行的结果不符合我们的预期,则我们说存在线程安全问题,即程序存在bug,反之,不存在线程安全问题. 1.2 线程不安全的原因 我们下面举出一个线程不安全的例子:我们想要在两个线程中对count进行操作 public class Demo9 …

RC电路延时时间常数在线计算器

RC电路延时时间常数在线计算器: https://www.838dz.com/calculator/1888.html 急用时&#xff0c;找不到。

后端通过@jsonformat格式化数据转发,前端无法正确显示

后端发送给前端的updatatime是有格式的 后端接收的数据没有任何变化&#xff0c;前端代码也很正常 显示时间也乱码 原因应该是某个注释和jsonformat冲突了&#xff0c;所幸就不用jesonformat 用手动配置的消息转换器 // 消息转换器&#xff0c;后端返回给前端数据格式化Overri…

用斐波那契数列感受算法的神奇(21亿耗时0.02毫秒)

目录 一、回顾斐波那契数列 二、简单递归方法 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &#xff08;三&#xff09;性能分析 三、采用递归HashMap缓存 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &…

C++入门----内联函数auto范围fornullptr指针

1.内联函数 顾名思义&#xff0c;内联函数也是函数的一种&#xff0c;我们在C语言的学习过程里面知道了函数和宏之间的区别和各自的优缺点&#xff1b; 函数的使用需要建立栈帧&#xff0c;宏的使用需要考虑各种符号的优先级问题&#xff0c;很容易出错&#xff0c;因为宏在使…