【JAVA进阶】Stream流

📃个人主页:个人主页

🔥系列专栏: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集合中

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

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

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

相关文章

使用go语言构建区块链 Part2.工作量证明

英文源地址 简介 在上一篇文章中, 我们构建了一个非常简单的数据结构, 这是区块链数据库的本质.并且我们可以通过它们之间的链式关系来添加区块: 每个区块都链接到前一个区块.哎, 我们的区块链实现有一个重大缺陷: 向链中添加区块既容易又便捷. 区块链和比特币的关键之一是增…

面对当下各种不确定性,如何面对,每天很忙碌,不慌

&#xff08;点击即可收听&#xff09; 疫情时期,都难,疫情之后,发现还更难 随着互联网的热度的下降,各大小公司纷纷勒紧裤腰带,受打击最大的无疑是底层打工人 每天一打开手机,会发现,一些大厂裁员信息霸榜头条,年龄也是一道坎 刚刚看到一个大v发的&#xff1a; 一个原先是跨国…

如何在 OpenSUSE 上安装 VirtualBox 7?

VirtualBox 是一款开源的虚拟化软件&#xff0c;允许用户在单个计算机上运行多个操作系统。本文将详细介绍如何在 OpenSUSE 上安装 VirtualBox 7。以下是安装过程的步骤&#xff1a; 步骤一&#xff1a;下载 VirtualBox 7 首先&#xff0c;我们需要下载 VirtualBox 7 的安装包…

真题详解(语法分析输入记号流)-软件设计(八十)

真题详解&#xff08;求叶子结点数&#xff09;-软件设计&#xff08;七十九)https://blog.csdn.net/ke1ying/article/details/130787349?spm1001.2014.3001.5501 极限编程XP最佳实践&#xff1a; 测试先行、 按日甚至按小时为客户提供可运行的版本。 组件图的 插座 和插头…

Pytorch的CNN,RNNLSTM

CNN 拿二维卷积举例&#xff0c;我们先来看参数 卷积的基本原理&#xff0c;默认你已经知道了&#xff0c;然后我们来解释pytorch的各个参数&#xff0c;以及其背后的计算过程。 首先我们先来看卷积过后图片的形状的计算&#xff1a; 参数&#xff1a; kernel_size &#xff…

使用Linkage Mapper工进行物种分布建模的步骤详解(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 引言:一、介绍二、数据准备2.1 物种分布数据获取2.2 环境变量数据获取2.3 数据预处理

车道线检测

前言 目前&#xff0c;车道线检测技术已经相当成熟&#xff0c;主要应用在自动驾驶、智能交通等领域。下面列举一些当下最流行的车道线检测方法&#xff1a; 基于图像处理的车道线检测方法。该方法是通过图像处理技术从摄像头传回的图像中提取车道线信息的一种方法&#xff0c…

FreeRTOS(6)----软件定时器

一&#xff0c;软件定时器概述 软件定时器允许设置一段时间&#xff0c;当设定的时间到达之后就会执行指定的功能函数&#xff0c;被定时器调用的这个函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。 二&#xff0c;回调函数的注意事项 回调函数是…

Django框架之模板过滤器

过滤器可以用来修改变量的显示样式。 使用方式 格式&#xff1a;{{变量|过滤器方法}}。可以连续使用&#xff0c;形式如&#xff1a;{{变量|过滤器方法1|过滤器方法2}}。 过滤器如下 Lower 转化为小写字母 格式&#xff1a;变量|lower Upper 转化为大写字母 格式&#xf…

chatgpt赋能python:Python的BeautifulSoup库和find_all()方法

Python的Beautiful Soup库和find_all()方法 在Web爬虫中&#xff0c;我们需要从网页中找到特定的HTML标记或属性&#xff0c;以便提取我们需要的数据。对于Python开发人员而言&#xff0c;Beautiful Soup是最流行的解析HTML和XML的库之一。该库可以让我们轻松地从HTML解析器中…

【Tcp通信服务器流程】

TCP通信流程 1、服务器端&#xff08;被动接收连接的角色&#xff09; &#xff08;1&#xff09;创建一个用于监听的套接字 - 监听&#xff1a;监听有客户端的连接 - 套接字&#xff1a;这个套接字其实就是一个文件描述符 &#xff08;2&#xff09;将这个监听文件描述符和…

26 KVM热迁移虚拟机

文章目录 26 KVM热迁移虚拟机26.1 总体介绍26.1.1 概述26.1.2 应用场景26.1.3 注意事项和约束限制 26.2 热迁移操作26.2.1 前提条件26.2.2 热迁移脏页率预测&#xff08;可选&#xff09;26.2.3 设置热迁移参数&#xff08;可选&#xff09;26.2.4 热迁移操作&#xff08;共享存…

微服务之事务处理

Informal Essay By English Hi guys、happy labor day. Everyone should have a good time to relax during the Labor Day holiday. But don’t forget to improve yourself during the holiday period 参考书籍&#xff1a; “凤凰架构” “微服务架构设计模式” 引言 …

golang 服务中 context 超时处理的思考

文章目录 前言起因&#xff1a;日志告警引发的思考什么是contextcontext的作用context超时之后继续执行 or 中断 最后 前言 公司运行的服务代码中&#xff0c;随处可见各种各样的日志信息&#xff0c;其中大多数是用来记录各种异常的日志&#xff0c;一方面&#xff0c;当出现…

Linux终端环境下的浏览器Lynx和Carbonyl 的基本使用方法

一、Carbonyl 是基于Chromium开发的运行于终端下的现代版浏览器&#xff0c;比Lynx的功能更好&#xff0c;目前尚在滚动开发过程中&#xff0c;但也基本可以用了。 1. 2安装非常简单&#xff0c;下载Binaries&#xff0c;Docker&#xff0c;nmp install, 都可以。 注意&#…

FPGA远程更新/远程调试的一种简单方法

之前介绍过一种远程&#xff08;无线&#xff09;更新的方式&#xff0c;详见《起飞&#xff01;通过无线WIFI下载调试FPGA》&#xff0c;这种方式缺点有两个&#xff1a;一是速度较慢&#xff1b;二是我们的设备中需要增加一个无线设备&#xff0c;增加成本的同时增加了暴露的…

SpringCloud(23):Sentinel对Spring Cloud Gateway的支持

代码地址&#xff1a;https://download.csdn.net/download/u013938578/87767363 从 1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&#xff1a; route 维度&#xff1a;即在 Spring 配置文件中配置的路…

setContentHuggingPriority和setContentCompressionResistancePriority的使用

需求&#xff1a; 两个label并排显示&#xff0c;文字内容由服务器返回&#xff0c;label宽度以文字内容自适应&#xff0c;label之间间距大于等于10. 需要考虑以下情况&#xff1a; 当两个label的宽度和 < 屏幕宽度时&#xff0c;各自设置约束&#xff0c;无需处理&#…

GPT-4版Windows炸场,整个系统就是一个对话机器人,微软开建AI全宇宙

原创 智东西编辑部 智东西 Windows的GPT时刻到来&#xff0c;变革PC行业。 作者 | 智东西编辑部 今日凌晨&#xff0c;Windows迎来了GPT-4时刻&#xff01; 在2023微软Build大会上&#xff0c;微软总裁萨蒂亚纳德拉&#xff08;Satya Nadella&#xff09;宣布推出Windows Co…

【模型预测】A-4D战斗机姿态控制的模型预测控制方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…