【JAVA进阶】Stream流

news2024/11/24 22:50:15

📃个人主页:个人主页

🔥系列专栏:JAVASE基础

目录

1.Stream流的概述

2.Stream流的获取

3.Stream流的常用方法


 

1.Stream流的概述

什么是Stream流?

  • 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
  • 目的:用于简化集合和数组操作的API。

 Stream流思想

Stream流式思想的核心:

  1. 先得到集合或者数组的Stream流(就是一根传送带)
  2. 把元素放上去
  3. 然后就用这个Stream流简化的API来方便的操作元素。

体验Stream流的作用

假设我们有一个Person类,其中包含属性name和age。我们有一个List<Person>对象,现在我们要使用Java Stream流来过滤出其中年龄大于18岁的人的名字。

public class Main {

    public static void main(String[] args) {

        List<Person> people = new ArrayList<>();
        people.add(new Person("Mike", 20));
        people.add(new Person("John", 17));
        people.add(new Person("Lucy", 25));

        people.stream().filter(p -> p.getAge() > 18).forEach((s-> System.out.println(s.getName())));
  


    }
}

输出:

Mike
Lucy

2.Stream流的获取

Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。

集合获取Stream流的方式

可以使用Collection接口中的默认方法stream​()生成流

名称

说明

default Stream<E> stream​()

获取当前集合对象的Stream流

 

public class Main {

    public static void main(String[] args) {

//----------------- Collection集合获取流------------------------
        Collection<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();
//----------------- Map集合获取流------------------------
        HashMap<String,Integer> map = new HashMap<>();
        //键流
        Stream<String> keyStream = map.keySet().stream();
        //值流
        Stream<Integer> valueStream = map.values().stream();
        //键值对流(拿整体)
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();


    }
}

数组获取Stream流的方式

名称

说明

public static <T> Stream<T> stream(T[] array)

获取当前数组的Stream流

public static<T> Stream<T> of(T... values) 

获取当前数组/可变数据的Stream流

 

    public static void main(String[] args) {
        String[] names=["热爱","编程的","小白白"];
        Stream<String> stream = Arrays.stream(names);
        Stream<String> stringStream = Stream.of(names);


    }

Stream流有三类方法:

  1. Intermediate(中间操作):对数据进行处理和转换,返回一个新的Stream对象,可以链式操作。包括常用的map、filter、distinct等方法。

  2. Terminal(终止操作):对Stream流进行聚合或收集操作,触发执行计算并返回结果。包括常用的forEach、reduce、collect等方法。

  3. Short-circuiting(短路操作):在满足一定条件时可以提前结束Stream流的操作。包括常用的anyMatch、allMatch、noneMatch等方法。

3.Stream流的常用方法

collect():将流中的元素收集到一个容器中。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
Set<String> wordSet = words.stream().collect(Collectors.toSet());
System.out.println(wordSet);

上述代码中,我们定义了一个包含字符串的List,使用Stream的collect()方法对其进行收集操作,将其结果保存在Set集合中,去除重复元素,最终将结果保存在wordSet的Set集合中,并打印输出。

Stream流的常用API中间操作方法包括:

1.filter():根据指定的条件过滤元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> result = list.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
System.out.println(result);

上述代码中,我们定义了一个包含整数的List,并使用Stream的filter()方法对其进行过滤,只保留其中的偶数,最终将结果保存在result的List中,并打印输出。

 

2.distinct():根据元素的 hashCode() 和 equals() 方法去重。

List<String> words = Arrays.asList("hello", "world", "hello", "java", "world");
List<String> uniqueWords = words.stream().distinct().collect(Collectors.toList());
System.out.println(uniqueWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的distinct()方法对其进行去重操作,最终将结果保存在uniqueWords的List中,并打印输出。

3.limit():限制元素数量。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
List<String> limitedWords = words.stream().limit(3).collect(Collectors.toList());
System.out.println(limitedWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的limit()方法对其进行限制操作,只保留前3个元素,最终将结果保存在limitedWords的List中,并打印输出。

4.skip():跳过指定数量的元素。

List<String> words = Arrays.asList("hello", "world", "java", "stream", "api");
List<String> skippedWords = words.stream().skip(2).collect(Collectors.toList());
System.out.println(skippedWords);

上述代码中,我们定义了一个包含字符串的List,使用Stream的skip()方法对其进行跳过操作,跳过前2个元素,只保留后面的元素,最终将结果保存在skippedWords的List中,并打印输出。


5.concat():合并a和b两个流为一个流

Stream<String> stream1 = Stream.of("Java", "is", "cool");
Stream<String> stream2 = Stream.of(" and", "fun", "too!");

Stream<String> resultStream = Stream.concat(stream1, stream2);
resultStream.forEach(System.out::print); // Output: Java is cool and fun too!

在这个例子中,我们首先创建两个字符串流 stream1 和 stream2,并使用 concat() 方法将它们连接在一起,形成一个新的流 resultStream。最后,我们遍历新的流,并将结果输出到控制台。

总之,Stream.concat() 方法可以将两个流连接为一个流,以便进行进一步的操作。

注意:

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

Stream流的常见终结操作方法:

1.forEach()  对此流的每个元素执行遍历操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println(n));

2.count()  返回此流中的元素数  

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().count();
System.out.println("Count: " + count);

注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

收集Stream流:

收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。

  • Stream流:方便操作集合/数组的手段。
  • 集合/数组:才是开发中的目的。

Stream流的收集方法:

名称

说明

R collect​(Collector collector)

开始收集Stream流,指定收集器

 Collectors工具类提供了具体的收集方式:

名称

说明

public static <T> Collector toList​()

把元素收集到List集合中

public static <T> Collector toSet​()

把元素收集到Set集合中

public static  Collector toMap​(Function keyMapper , Function valueMapper)

把元素收集到Map集合中

 上面案例有使用过,所以就不举例子了....

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

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

相关文章

HNU数据结构与算法分析-作业4-图结构

1. (简答题) 【应用题】11.3 &#xff08;a&#xff09;画出所示图的相邻矩阵表示 &#xff08;b&#xff09;画出所示图的邻接表表示 &#xff08;c&#xff09;如果每一个指针需要4字节&#xff0c;每一项顶点的标号占用2字节&#xff0c;每一条边的权需要2字节&#xff0…

计算机体系结构存储系统

存储系统原理 两种典型的存储系统&#xff1a;Cache存储系统和虚拟存储系统。前者主要目的是提高存储器速度&#xff0c;后者有主存储器和硬盘构成&#xff0c;主要用于扩大存储器容量。 存储系统的访问效率 e T 1 T 1 H ( 1 − H ) T 2 T 1 f ( H , T 2 T 1 ) e\frac{T_…

魔改车钥匙实现远程控车:(4)基于compose和经典蓝牙编写一个控制APP

前言 这篇文章不出意外的话应该是魔改车钥匙系列的最后一篇了&#xff0c;自此我们的魔改计划除了最后的布线和安装外已经全部完成了。 不过由于布线以及安装不属于编程技术范围&#xff0c;且我也是第一次做&#xff0c;就不献丑继续写一篇文章了。 在前面的文章中&#xf…

基于torch实现模型剪枝

一、剪枝分类 所谓模型剪枝&#xff0c;其实是一种从神经网络中移除"不必要"权重或偏差&#xff08;weigths/bias&#xff09;的模型压缩技术。关于什么参数才是“不必要的”&#xff0c;这是一个目前依然在研究的领域。 1.1、非结构化剪枝 非结构化剪枝&#xff08;…

什么是可持续能源?

随着全球经济的不断发展和人口的不断增长&#xff0c;能源问题越来越受到关注。传统能源已经不能满足人们对能源的需求&#xff0c;同时也对环境和健康带来了严重的影响。为了解决这些问题&#xff0c;出现了可持续能源的概念。那么&#xff0c;什么是可持续能源呢&#xff1f;…

逐渐从土里长出来的小花

从土里逐渐长出来的小花&#xff08;这是长出来后的样子&#xff0c;图片压缩了出现了重影~&#xff09; 代码在这里&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&g…

MySQL-索引(2)

本文主要讲解MySQL-索引相关的知识点 联合索引前缀索引覆盖索引索引下推索引的优缺点什么时候适合创建索引,什么时候不适合?如何优化索引 ? 索引失效场景 ? 为什么SQL语句使用了索引,却还是慢查询 ? 使用索引有哪些注意事项 ? InnoDB引擎中的索引策略 目录 联合索引 联合…

LeetCode高频算法刷题记录6

文章目录 1. 编辑距离【困难】1.1 题目描述1.2 解题思路1.3 代码实现 2. 寻找两个正序数组的中位数【困难】2.1 题目描述2.2 解题思路2.3 代码实现 3. 合并区间【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 爬楼梯【简单】4.1 题目描述4.2 解题思路4.3 代码实现 5. 排序链…

chatgpt赋能Python-python3_9安装numpy

Python 3.9 安装 NumPy 的完整指南 Python是一种功能强大的编程语言&#xff0c;已成为数据分析、人工智能和科学计算领域的主流语言之一。NumPy是一个Python库&#xff0c;用于执行高效的数值计算和科学计算操作。Python 3.9是Python最新版本&#xff0c;带来了许多新功能和改…

一款非常有趣的中国版本的Excalidraw作图工具drawon(桌案)

桌案工具集成了很多有趣的在线作图工具&#xff0c; 思维导图&#xff0c; 流程图&#xff0c;以及草图&#xff0c;在线ppt等功能。 而草图是基于国外有名的Excalidraw而改造而来&#xff0c;使得它更符合国人的使用习惯。 最近在 使用excalidraw时&#xff0c;发现了很多新功…

Excel | 基因名都被Excel篡改了怎么办呢!?~(附3种解决方案)

1写在前面 今天和大家分享一下在做表达矩阵处理时尝尝会遇到的一个问题&#xff0c;但又经常被忽视&#xff0c;就是Excel会修改你的基因名。&#x1f637; 无数大佬在这里都踩过坑&#xff0c;这些普遍的问题已经被写成了paper&#xff08;左右滑动&#xff09;&#xff1a;&a…

75.建立一个主体样式第一部分

我们的目标如下图所示 ● 首先建立文件夹&#xff0c;生成框架代码 ● 把页面上面的HTML元素写进去 <header><nav><div>LOGO</div><div>NAVIGATION</div></nav><div><h1>A healty meal delivered to your door, ever…

Java基础--->并发部分(2)【Java中的锁】

文章目录 synchronized和ReentrantLock的区别Java中锁的名词synchronized锁ReentrantLock锁 synchronized和ReentrantLock的区别 synchronized 和 ReentrantLock 都可以用来实现 Java 中的线程同步。它们的作用类似&#xff0c;但是在用法和特性上还是有一些区别的。 synchroni…

【2023/05/20】Visual Basic

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第15天。 Visual Basic是一种广泛应用于Windows操作系统的编程语言&#xff0c;它是Microsoft公司开发的一种面向对象的编程语言&#xff0c;以其简单、易学、易用的特点受到广泛欢迎。本文旨在介绍Visual…

2023年申请美国大学,需要SAT/ACT成绩吗?

受疫情影响&#xff0c;2021 和 2022 年申请美国大学时&#xff0c;许多大学都放宽了SAT/ACT门槛&#xff0c;不强行要求学生提交标化成绩。今年3月&#xff0c;理工大牛院校 MIT 率先打破了这个局面&#xff0c;宣布恢复 SAT/ACT 标化成绩要求&#xff0c;随后几个大学也陆续宣…

Java --- 云尚办公用户管理模块实现

目录 一、用户管理 1.1、数据库表 1.2、使用代码生成器生成相关代码 1.3、后端代码 1.4、前端代码 二、用户与角色功能实现 一、用户管理 1.1、数据库表 CREATE TABLE sys_user (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 会员id,username VARCHAR(20) NOT NU…

Java面试知识点(全)-spring面试知识点一

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 Spring原理 Spring ioc概念&#xff1a;控制权由对象本身转向容器&#xff1b;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系。核心&am…

学术会议参会经验分享一(参会前的准备工作)

前前后后参加了两次学术会议&#xff0c;一次是今年三月份在深圳&#xff0c;另一次是在五月份在南宁&#xff0c;并且两次都进行了主题演讲。总的来说&#xff0c;我感觉参加学术会议重要的是自身能力的提升&#xff0c;比如说演讲、PPT制作等更方面的能力。下面我来分享一些我…

USRP概念基础

GBIC Gigabit Interface Converter的缩写,是将千兆位电信号转换为光信号的接口器件。GBIC设计上可以为热插拔使用。 SFP SFP (Small Form Pluggable)可以简单理解为GBIC(Gigabit Interface Converter的缩写)升级版本,是将千兆位电信号转换为光信号的接口器件,可以热插…

python字符串拼接

首先 什么是字符串拼接 我们来看一个段代码 print("你好""小猫猫")运行结果如下 这是一个最简单的演示 字符串 与 字符串的拼接 两个字符串字面量可以直接用加号 合并成一个字符串 当然 直接这里 字面量字面量 直接写上去看着会非常傻 所以 一般都是 变…