(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标:

  • 掌握 Java Stream流的相关api
  • 掌握 Java Stream流的基本实现
  • 掌握 java Stream流的使用场景
  • 代码已经整理上传到了gitee中,有需要的小伙伴可以取查看一下源码点个小心心喔

大家也可以帮我提交一点案例喔!!!!!
大家一起交流学习!
https://gitee.com/Aoyuan-210902/JAVAStreamDemo.git


点个赞嘛!!!!!!!!!!!!!!!!!!!!!!!!!
在这里插入图片描述

JAVA Stream流

概述

Java Stream API 是 Java 8 中引入的一个功能强大的新库,它提供了一种高效且声明式的处理数据集合的方法。通过使用 Streams,开发者可以写出简洁且易于理解的代码,用于对数据执行复杂的查询和聚合操作。

什么是Stream流,Stream流的特点是什么?

  • 含义
    在 Java 中,Stream 是对集合(Collection)对象功能的一个补充,它支持顺序和并行的聚集操作。Streams 不存储数据,它们只在需要时从源(如集合或数组)中获取数据。

  • 主要特点
    声明式:相比于传统的迭代方式,stream 提供了一种声明式的方法来表达数据处理任务。
    可组合:stream 操作可以链接起来,形成一个大的流水线,这样可以表达复杂的数据处理策略(比如筛选,排序等)。
    并行能力:Streams 可以透明地并行处理,利用多核架构而无需编写特定的多线程代码。

常见操作

Stream 操作分为中间操作和终端操作两种:

中间操作:如 filter、map、sorted 等,它们返回一个新的 Stream,可以连接多个中间操作。
终端操作:如 forEach、collect、reduce 等,它们输出结果或者产生副作用(例如输出到屏幕),并且关闭 Stream。

一些Stream的特性

  • 函数式编程: 通过Stream流可以代替复繁琐难懂的for循环等代码,对数据进行操作。
  • Stream流不会直接得出结果,而是在调用终端操作的时候,才会运行中间操作。

Optional类

在Java中,Optional是一个容器类,它可以包含也可以不包含非空值。Optional类主要用于防止NullPointerException异常的发生,它提供了一种更优雅的方法来处理可能为null的对象。使用Optional可以显式地要求调用者处理空值情况。

Optional提供了多种方法来检查、获取和转换包含的值:

isPresent():检查Optional是否有值。
get():获取Optional的值,如果Optional为空,则抛出NoSuchElementException。
orElse():如果Optional有值则返回该值,否则返回传递给orElse的参数。
ifPresent():如果值存在,执行给定的操作。 map()和flatMap():对Optional的值应用函数。
Optional常用于新的Java API中,如Stream的终端操作,返回一个Optional类型的结果

Stream流的操作

distinct

package distinctStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class DistincrtStrream {public static void main(String[] args) {//distint主要是去除掉集合中重复的代码List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6);List<Integer> collect = list.stream().distinct().collect(Collectors.toList());collect.forEach(System.out::println);}
}
运行实例

在这里插入图片描述

filter筛选操作

示例1

package filterStream;import java.util.ArrayList;
import java.util.List;public class FilterDemo01 {//找到集合中元素大于5的数public static void main(String[] args) {List<Integer> demo01 = new ArrayList<>();demo01.add(1);demo01.add(5);demo01.add(7);demo01.add(8);demo01.add(9);System.out.println("没有进行筛选之前的数据");demo01.forEach(System.out::println);System.out.println("筛选之后的数据");demo01.stream().filter(x -> x > 5).forEach(System.out::println);}
}

在这里插入图片描述
示例2

package filterStream;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterDemo02 {public String username;public String password;public FilterDemo02() {}public FilterDemo02(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "FilterDemo02{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public static void main(String[] args) {FilterDemo02 user01 = new FilterDemo02("aoyuan","123");FilterDemo02 user02 = new FilterDemo02("yuan","234");FilterDemo02 user03 = new FilterDemo02("ao","345");List<FilterDemo02> list  = new ArrayList<>();list.add(user01);list.add(user02);list.add(user03);//查找username = aoyuan的List<FilterDemo02> collect = list.stream().filter(n -> n.getUsername().equals("aoyuan")).collect(Collectors.toList());collect.forEach(System.out::println);System.out.println("------------------------------------------------------------------------------");//查找username =aoList<FilterDemo02> collect01 = list.stream().filter(n -> n.getUsername().equals("ao")).collect(Collectors.toList());collect01.forEach(System.out::println);System.out.println("------------------------------------------------------------------------------");List<FilterDemo02> collect02 = list.stream().filter(n -> n.getPassword() != "123").collect(Collectors.toList());collect02.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

limit截取操作

示例1

package limitStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class LimitDemo01 {public static void main(String[] args) {//limit是截取第n个元素List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);Stream<Integer> limit1 = list.stream().limit(2);Stream<Integer> limit2 = list.stream().limit(6);System.out.println("----------------截取第2个---------------");limit1.forEach(System.out::println);System.out.println("-----------------截取6个---------------------");limit2.forEach(System.out::println);}
}
运行示例

在这里插入图片描述
示例2

package limitStream;import java.util.stream.Stream;public class LimitDemo02 {public static void main(String[] args) {//interage迭代器会一直进行下去,所以由inerate创建的流是无限流,需要limit方法截断Stream<Integer> demo03 = Stream.iterate(0, n -> n+2).limit(6);demo03.forEach(System.out::println);System.out.println("limit起到了什么作用呢?起到了截断的作用");Stream<Integer>  demo04 = Stream.iterate(0,n -> n+2).limit(7);demo04.forEach(System.out::println);System.out.println("generate方法");//generate方法Stream<Double> generateStream = Stream.generate(Math::random).limit(5);generateStream.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

map映射操作

User类

package mapStream;public class User {private String username;private Integer id;private String address;public User() {}public User(String username, Integer id, String address) {this.username = username;this.id = id;this.address = address;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", id=" + id +", address='" + address + '\'' +'}';}
}

userdao类

package mapStream;public class UserDao {private String username;private String address;public UserDao() {}public UserDao(String username, String address) {this.username = username;this.address = address;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "UserDao{" +"username='" + username + '\'' +", address='" + address + '\'' +'}';}
}

示例1

package mapStream;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterDemo01 {public static void main(String[] args) {List<User>  userList= new ArrayList<>();userList.add(new User("aoyuan",1,"baotou"));userList.add(new User("aoyuan01",2,"bao"));userList.add(new User("aoyuan02",3,"tou"));//拿到用户集合中的数据并将用户名转化为大写List<String> collect = userList.stream().map(x -> x.getUsername().toUpperCase()).collect(Collectors.toList());collect.forEach(System.out::println);//拿到user集合选择数据存储在新的userDao集合中List<UserDao> collect1 = userList.stream().map(x -> {UserDao userDao = new UserDao();userDao.setUsername(x.getUsername());userDao.setAddress(x.getAddress());return userDao;}).collect(Collectors.toList());collect1.forEach(System.out::println);}
}
运行示例

在这里插入图片描述
示例2

package mapStream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FilterDmeo02 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);List<Integer> collect = list.stream().map(x -> x + 3).collect(Collectors.toList());collect.forEach(System.out::println);}}
运行示例

在这里插入图片描述

取max和min的相关操作

示例1

package maxStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class Demo {public static void main(String[] args) {//自定义排序List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);//从大到小排序Optional<Integer> max = list.stream().max((o1, o2) -> o1 - o2);System.out.println("最大值为+"+ max.get());}
}

运行示例

在这里插入图片描述

示例2

package maxStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;public class Demo01 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);Optional<Integer> max = list.stream().max(Integer::compareTo);System.out.println("最大值为+:"+ max);}
}

运行示例

在这里插入图片描述

示例3

package maxStream;import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;public class Demo02 {public static void main(String[] args) {List<String> strings = Arrays.asList("aoyuan", "aoyuanao", "aoyuanaoyuan");Optional<String> max = strings.stream().max(Comparator.comparing(String::length));System.out.println("最长的字符串为" + max);}}

运行示例

在这里插入图片描述
示例3

package minStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class StreamMinExample01 {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}int getAge() {return age;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Bob", 20),new Person("Charlie", 30),new Person("David", 25));Optional<Person> youngest = people.stream().min((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));youngest.ifPresent(person -> System.out.println("The youngest person is " + person));}
}

运行示例

在这里插入图片描述

示例4

package minStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class StreamMinExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, -1, 6, 7);// Using Stream.min() to find the minimum value in the listOptional<Integer> minNumber = numbers.stream().min(Integer::compare);// Checking and displaying the minimum numberif (minNumber.isPresent()) {System.out.println("The minimum number is " + minNumber.get());} else {System.out.println("List is empty.");}}
}

运行示例

在这里插入图片描述

reduce归约

package reduce;import java.util.ArrayList;
import java.util.List;
import java.util.Optional;public class ReduceStreamDemo {public static void main(String[] args) {List<Integer> demo = new ArrayList<>();demo.add(2);demo.add(4);demo.add(1);demo.add(5);
//x+y的和Optional<Integer> reduce = demo.stream().reduce((x, y) -> x + y);System.out.println(reduce.get());//求最大值Optional<Integer> reduce1 = demo.stream().reduce((x, y) -> x > y ? x : y);System.out.println(reduce1.get());}
}
运行示例

在这里插入图片描述

排序

示例1

package sortStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}String getName() {return name;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Charlie", 30),new Person("David", 25),new Person("Bob", 20));List<Person> sortedPeople = people.stream().sorted((p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());sortedPeople.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

示例2

package sortStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample02 {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Charlie", 30),new Person("David", 25),new Person("Bob", 20));// Sorting people by age using StreamList<Person> sortedByAge = people.stream()//自然排序.sorted((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge())).collect(Collectors.toList());// Displaying the sorted listsortedByAge.forEach(System.out::println);System.out.println("------------------自定义排序--------------");//先根据年龄再根据姓名排序List<Person> collect = people.stream().sorted((p1, p2) -> {if (p1.getAge() == p2.getAge()) {return p1.getName().compareTo(p2.getName());} else {return p2.getAge() - p1.getAge();}}).collect(Collectors.toList());collect.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

总结

作用场景

Java Stream API 是用于处理集合和数据库的理想选择,它能够执行如排序、过滤或映射数据等聚合操作。Stream 支持并行处理,使得它能够有效地处理大型数据集。此外,Stream 在处理数据序列时能增强代码的可读性和减少样板代码,使编程更加表达和简洁。它在 Java 中的函数式编程模式中尤为有价值,帮助以声明方式操作集合。

优势和不足

优势
  1. 提高代码可读性和简洁性:通过流式表达式,可以用更少的代码完成复杂的集合处理,使代码更易于理解和维护。
  2. 支持并行处理:Stream API 设计支持并行执行,可以很容易地对数据进行并行处理,提高处理效率,尤其适用于处理大数据量。
  3. 函数式编程:支持函数式编程风格,有助于减少副作用,使程序更加稳定。
不足
  1. 性能开销:相对于传统的 for-loop,Stream 操作可能引入更多的性能开销,尤其是在小数据量或高性能场景中。
  2. 学习曲线:对于初学者,Stream API 的一些操作和概念可能比较难以理解,需要一定的学习投入。
  3. 调试困难:由于 Stream 操作的链式结构,调试可能比较复杂,特别是在流水线操作中定位问题可能比较困难。

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

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

相关文章

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

docker容器技术篇:容器集群管理实战mesos+zookeeper+marathon(一)

容器集群管理实战mesoszookeepermarathon&#xff08;一&#xff09; mesos概述 1.1 Mesos是什么 Apache Mesos 是一个基于多资源调度的集群管理软件&#xff0c;提供了有效的、跨分布式应用或框架的资源隔离和共享&#xff0c;可以运行 Hadoop、Spark以及docker等。 1.2 为…

maven多模块创建-安装配置

1、前提 许久没有写文章了&#xff0c;荒废了2年多的时间&#xff0c;在整理的时候&#xff0c;发现Maven还差一篇安装配置的文章&#xff0c;现在开始提笔完善它&#xff0c;参考&#xff1a;https://blog.csdn.net/m0_72803119/article/details/134634164。 —写于2024年4月…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

自然语言处理: 第二十八章大模型基底之llama3

项目地址: meta-llama/llama3: The official Meta Llama 3 GitHub site 前言 LLaMa系列一直是人们关注的焦点&#xff0c;Meta在4月18日发布了其最新大型语言模型 LLaMA 3。该模型将被集成到其虚拟助手Meta AI中。Meta自称8B和70B的LLaMA 3是当今 8B 和 70B 参数规模的最佳模…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

ISP比普通的静态代理相比有什么优势?

ISP&#xff08;Internet Service Provider&#xff09;&#xff0c;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址&#xff0c;具有稳定性强、兼容性好和管理方便等特点。当我…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

基于Python+Selenium+Pytest的Dockerfile如何写

使用 Dockerfile 部署 Python 应用程序与 Selenium 测试 在本文中&#xff0c;我们将介绍如何使用 Dockerfile 部署一个 Python 应用程序&#xff0c;同时利用 Selenium 进行自动化测试。我们将使用官方的 Python 运行时作为父镜像&#xff0c;并在其中安装所需的依赖项和工具…

【白菜学习问问问系列】if __name__ == ‘__main__‘:怎么理解

可以让.py文件既可以当成一个模块调用&#xff0c;也可以单独的作为一个函数执行

用html画一个四叶草

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>四叶草</title> <link href"" rel"stylesheet"> <link rel"stylesheet" href"css/style.css&q…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

详解数据结构:队列(含栈与队列扩展)

一、顺序队列 有一种线性序列&#xff0c;特点是先进先出&#xff0c;这种存储结构称为队列。队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能再两端操作&#xff1a;一端进、一端出。进的一端称为队尾&#xff0c;出的一端称为队头。队列可以用顺…

贪心算法在单位时间任务调度问题中的应用

贪心算法在单位时间任务调度问题中的应用 一、引言二、问题描述与算法设计三、算法证明四、算法实现与效率分析五、C语言实现示例六、结论 一、引言 单位时间任务调度问题是一类经典的优化问题&#xff0c;旨在分配任务到不同的时间槽中&#xff0c;使得某种性能指标达到最优。…

RTU遥测终端为城市排水安全保驾护航!

近年来&#xff0c;全球气候变迁与城市化进程不断加速&#xff0c;导致强降雨事件频发&#xff0c;道路低洼地带、下穿式立交桥和隧道等区域在暴雨中常易积水&#xff0c;严重阻碍了人民的出行&#xff0c;甚至危及生命与财产安全。而传统的排水管网管理方式已难以适应现代城市…

elasticsearch-8.1.0安装记录

目录 零、版本说明一、安装二、使用客户端访问 零、版本说明 centos [rootnode1 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)elasticsearch elasticsearch-8.1.0-linux-x86_64一、安装 systemctl stop firewalld.servicesystemctl disable firewal…

MATLAB 数据类型

MATLAB 数据类型 MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名&#xff0c;它就创建变量并分配适当的内存空间。 如果变量已经存在&#xff0c;那么MATLAB将用新内容替换原始内容&#xff0c;并在必要时分配新的存储空间。 例如&#xff0c; Tota…

【Linux】深入理解Linux文件系统与日志分析

目录 一、inode与block 1.block与inode概述 2.inode的内容 3.inode号码 4.inode的大小 5.访问文件的简单流程 6.inode的特殊作用 7.通过indoe号删除rm常规方法删除不掉的文件 二、硬链接和软链接 三、恢复误删除的文件 1.恢复EXT类型的文件 示例 2.xfs类型文件备份…