进阶JAVA篇-深入了解 Stream 流对象的创建与中间方法、终结方法

目录

        1.0 Stream 流的说明

        2.0 Stream 流对象的创建

        2.1 对于 Collection 系列集合创建 Stream 流对象的方式

        2.2 对于 Map 系列集合创建 Stream 流对象的方式

        2.3 对于数组创建 Stream 流对象的方式

        3.0 Stream 流的中间方法

        3.1 Stream 流的 filter() 中间方法

        3.2 Stream 流的 sorted() 中间方法

        3.3 Stream 流的 limit(x) 中间方法

        3.4 Stream 流的 skip(x) 中间方法

        3.5 Stream 流的 map() 中间方法

        3.6 Stream 流的 distinct() 中间方法

        3.7 Stream 流的 concat() 中间方法

        4.0 Stream 流的终结方法

        4.1 Stream 流的 forEach 终结方法

        4.2 Stream 流的 count() 终结方法

        4.3 Stream 流的 max() 或者 min() 终结方法

        5.0 Stream 流的 collect() 收集方法


        1.0 Stream 流的说明

        Stream(流)是一种数据处理的概念,它可以用来处理集合数组输入/输出等数据源的元素序列。流可以看作是一个从源到目标的元素序列,可以通过一系列连续的操作对其进行处理。流的操作可以分为两种类型:中间操作和终端操作。中间操作是对流进行处理并返回一个新的流,而终端操作是对流进行最终的处理并返回一个结果或副作用。

        2.0 Stream 流对象的创建

        主要以数组集合来创建 Stream 流对象。

        2.1 对于 Collection 系列集合创建 Stream 流对象的方式

        直接用集合对象.stream() 实例方法创建 Stream 流对象。

以代码的形式来具体介绍:

        // List 集合系列来创建 Stream 流对象List<String> list = new ArrayList<>();Collections.addAll(list,"张三","李四","王五","张麻子");Stream<String> stream = list.stream();// Set 集合系列来创建 Stream 流对象Set<String> set = new HashSet<>();Collections.addAll(set,"张三","李四","王五","张麻子");Stream<String> stream1 = set.stream();

       

        2.2 对于 Map 系列集合创建 Stream 流对象的方式

        具体来介绍两种方式:第一种方法;把键值对“封装”成一个整体。第二种方法;分别把集合中的键和值全部获取出来,单独放在各个集合中。

以代码的形式来具体介绍:

        // Map 集合系列来创建 Stream 流对象Map<String,Integer> m = new HashMap<>();m.put("张三",19);m.put("李四",28);m.put("王五",33);m.put("张麻子",22);//第一种方法:把键值对“封装”成一个整体Set<Map.Entry<String,Integer>> entries = m.entrySet();Stream<Map.Entry<String,Integer>> stream2 = entries.stream();//第二种方法:分别把集合中的键和值全部获取出来,单独放在系列集合中Set<String> k = m.keySet();Collection<Integer> v = m.values();Stream<String> stream3 = k.stream();Stream<Integer> stream4 = v.stream();

        2.3 对于数组创建 Stream 流对象的方式

        具体来介绍有两种方式来创建对象:第一种方法;Arrays.stream() 方法来创建。第二种方法;Stream.of() 方法来创建。

以代码的形式来具体介绍:

        // 用数组来创建 Stream 流对象String[] strings = new String[]{"张三","李四","王五","张麻子"};//第一种方法:用 Arrays.stream() 方法来创建Stream<String> stream5 = Arrays.stream(strings);//第二种方法:用 Stream.of() 方法来创建Stream<String> stream6 = Stream.of(strings);

        

        3.0 Stream 流的中间方法

        Stream 流的中间方法主要用于对流中的元素进行处理,返回一个新的流对象。这些中间方法可以组合使用,形成流水线式的处理流程,方便进行复杂的数据处理操作。

        3.1 Stream 流的 filter() 中间方法

        用于对流中的数据进行过滤。

通过具体代码实现:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<String> list = new ArrayList<>();Collections.addAll(list,"张三","李四","王五","张麻子");//对一下代码解读:首先用 stream() 得到了该集合的流,//然后用 filter() 用于对流中的数据进行过滤,也可以理解成筛选字符串中带有“张”的,返回新流,//该新流中都是含“张”的字符串,接着把流中的数据进行用 forEach() 方法进行遍历。/*list.stream().filter(s -> s.contains("张")).forEach(s-> System.out.println(s));*///对以上代码稍微简化,如以下:list.stream().filter(s -> s.contains("张")).forEach(System.out::println);}
}

运行结果如下:

        3.2 Stream 流的 sorted() 中间方法

        按照指定规则排序。

通过具体代码实现:

        

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));//解读以下代码:首先先利用 stream() 方法来获取该集合的流,然后用 sorted() 方法,由于是自定义类型的对象,//默认的 sorted() 方法是搞不定,所以需要重写方法,因此可以接入这个匿名内部类来重写内部的具体方法,//排完序之后会得到一个新的流,然后经过 forEach 方法来遍历该流中的数据。list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(s-> System.out.println(s));//以上代码话可以继续简化,效果是一样的System.out.println("--------------------------------------------------------------------");list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(System.out::println);}
}

运行结果如下:

        3.3 Stream 流的 limit(x) 中间方法

        获取前面 x 个元素。

通过具体代码实现:

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));//对一下代码进行解读:先获取该集合的流,然后用 limit(2) 中间方法,获取前面2个元素,//返回新流,接着对新流进行遍历输出元素list.stream().limit(2).forEach(System.out::println);}
}

运行结果如下:

        3.4 Stream 流的 skip(x) 中间方法

        跳过前面 x 个元素。

通过具体代码实现:

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));//对一下代码进行解读:先得到该集合的流,然后用 skip(2) 中间方法,跳过前面2个元素,//得到的新流中包含后面两个元素,然后就进行遍历了。list.stream().skip(2).forEach(System.out::println);}
}

运行结果如下:

        3.5 Stream 流的 map() 中间方法

        对元素进行加工,并返回对应的新流。(映射

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));//解读以下代码: 先得到该集合的流,然后调用 map() 中间方法,//将对应的元素进行加工,简单的来说就是,将原先的元素加工成自己想要的形式,//以下就是将学生类对象加工成字符串,["张三",19] -> "张三",每一个元素都是一一对应、映射的。list.stream().map(s->s.getName()).forEach(System.out::println);}
}

运行结果如下:

        3.6 Stream 流的 distinct() 中间方法

        去除流中重复的元素。但是对于自定义类型的元素,默认的 distinct() 方法是不能完成去除重复的元素。希望内容一样就认为重复,这就需要重写 hashCode()equals() 方法。

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));list.add(new Student("张三",19));//解读以下代码: 先获取该集合中的流,然后调用 distinct() 方法,但是该流中的元素是自定义,//所以希望内容一样就认为重复,这就需要重写 hashCode() 与 equals() 方法。//去重后,返回一个新流。list.stream().distinct().forEach(System.out::println);}
}

运行结果如下:

         如果对重写 hashCode() equals() 方法不太熟悉,可以点击以下链接去了解以下:

        进阶JAVA篇-深入了解 Set 系列集合-CSDN博客

        3.7 Stream 流的 concat() 中间方法

        合并 a 和 b 两个流为一个流。

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));List<Student> list1 = new ArrayList<>();list1.add(new Student("李麻子",23));Stream<Student> stream = Stream.concat(list.stream(),list1.stream());stream.forEach(System.out::println);}
}

运行结果如下:


 

        4.0 Stream 流的终结方法

        Stream 流的终结方法用于对流进行最终的处理并返回一个结果或副作用。对流进行最终的处理并获取结果。需要注意的是,终结方法只能对流进行一次操作,一旦流被消费,就不能再次使用。

        4.1 Stream 流的 forEach 终结方法

        对此流运算后的元素执行后遍历。

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));List<Student> list1 = new ArrayList<>();list1.add(new Student("李麻子",23));Stream.concat(list.stream(),list1.stream()).forEach(System.out::println);}
}

运行结果如下:

        4.2 Stream 流的 count() 终结方法

        统计此流运算后的元素个数。需要注意的是:返回值是 long 类型。

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三",19));list.add(new Student("李四",22));list.add(new Student("王五",17));list.add(new Student("张麻子",33));List<Student> list1 = new ArrayList<>();list1.add(new Student("李麻子",23));System.out.println(Stream.concat(list.stream(), list1.stream()).count());}
}

运行结果如下:

        4.3 Stream 流的 max() 或者 min() 终结方法

        获取此流运算后的最大值或者最小值元素。但是对于自定义的类型,默认的 max() 方法是不能获取此流的最大值元素,默认的 min() 方法是不能获取此流的最小值元素,会报异常,此时就需要用到比较器了。

通过代码具体实现:

import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 19));list.add(new Student("李四", 22));list.add(new Student("王五", 17));list.add(new Student("张麻子", 33));Student s1 = list.stream().max((o1, o2) -> o1.getAge() - o2.getAge()).get();System.out.println("最大年龄为:"+s1.getAge());Student s2 = list.stream().min((o1, o2) -> o1.getAge() - o2.getAge()).get();System.out.println("最小年龄为:"+s2.getAge());}
}

运行结果如下:

        5.0 Stream 流的 collect() 收集方法

        把流处理后的结果收集到一个指定的集合中去。

通过代码具体实现:

一. 收集到 list 系列集合中

import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 19));list.add(new Student("李四", 22));list.add(new Student("王五", 17));list.add(new Student("张麻子", 33));//对以下代码进行解读:先得到该集合的流,再筛选开头为“张”的名字,得到一个新流,再收集到 List 系列集合中。List<Student> list1 =  list.stream().filter(s->s.getName().startsWith("张")).collect(Collectors.toList());System.out.println(list1);}
}

运行结果如下:

二.收集到 Set 系列集合中

import java.util.*;
import java.util.stream.Collectors;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 19));list.add(new Student("李四", 22));list.add(new Student("王五", 17));list.add(new Student("张麻子", 33));//对一下代码进行解读: 先得到该集合的流,再进行筛选出年龄大于18的元素,// 最后再将这些集合中的元素收集到 Set 系列集合中。Set <Student> set = list.stream().filter(s->s.getAge() > 18).collect(Collectors.toSet());System.out.println(set);}
}

运行结果如下:

三.收集到 Map 系列集合中

import java.util.*;
import java.util.stream.Collectors;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 19));list.add(new Student("李四", 22));list.add(new Student("王五", 17));list.add(new Student("张麻子", 33));Map<String,Integer> map = list.stream().collect(Collectors.toMap(s-> s.getName(), s-> s.getAge()));System.out.println(map);}
}

运行结果如下:

四.收集到数组

import java.util.*;public class StreamIntermediateMethod {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 19));list.add(new Student("李四", 22));list.add(new Student("王五", 17));list.add(new Student("张麻子", 33));Student[] students = list.stream().toArray(s->new Student[s]);//以上代码简化为如下:Student[] students1 = list.stream().toArray(Student[]::new);System.out.println(Arrays.toString(students));System.out.println(Arrays.toString(students1));}
}

运行结果如下:

         本篇就先讲到这里!!!点击以下链接有更多篇目:小扳_-CSDN博客



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

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

相关文章

C++基类和派生类的内存分配,多态的实现

目录 基类和派生类的内存分配基类和派生类的成员归属多态的实现 基类和派生类的内存分配 类包括成员变量&#xff08;data member&#xff09;和成员函数&#xff08;member function&#xff09;。 成员变量分为静态数据&#xff08;static data&#xff09;和非静态数据&…

Git简明教程

1.Git的定位 在我们自己开发项目的过程中&#xff0c;经常会遇到这样的情况&#xff0c;为了防止代码丢失&#xff0c;或者新变更的代码影响到原有的代码功能&#xff0c;为了在失误后能恢复到原来的版本&#xff0c;不得不复制出一个副本,比如&#xff1a;“坦克大战1.0”“坦…

【Html】交通灯问题

效果 实现方式 计时器&#xff1a;setTimeout或setInterval来计时。setInterval和 setTimeout 在某些情况下可能会出现计时不准确的情况。这通常是由于JavaScript的事件循环机制和其他代码执行所需的时间造成的。 问询&#xff1a;通过getCurrentLight将每个状态的持续时间设置…

Git常用的命令有哪些?

一、前言 git 的操作可以通过命令的形式如执行&#xff0c;日常使用就如下图6个命令即可 实际上&#xff0c;如果想要熟练使用&#xff0c;超过60多个命令需要了解&#xff0c;下面则介绍下常见的的git 命令 二、有哪些 配置 Git 自带一个 git config 的工具来帮助设置控制…

Haproxy 服务

Haproxy&#xff1a;他也是常用的负载均衡软件 nginx 支持四层转发&#xff0c;七层转发 haproxy 也是四层和七层转发 LVS的DR和NAT都是基于四层转发 都是基于流量的转发。 tun:四层和七层都有。 基于四层的转发&#xff1a; 1&#xff0c;lvs 2&#xff0c;nginx 3&…

对python中切片详解

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Python中什么可以切片 Python中符合序列的有序序列都支持切片(slice) 如:列表,字符,元祖 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视…

“唯品会VIP商品API:一键获取奢侈品详情,尊享品质生活!“

要获取唯品会VIP商品的详细信息&#xff0c;您可以通过唯品会的API接口进行调用。 唯品会提供了多种商品选择&#xff0c;包括服装、美容护肤、鞋子、箱包、家居、母婴等等。在这些商品中&#xff0c;VIP奢侈品专区是唯品会的重要特色之一。 要获取VIP商品的详细信息&#xf…

计算机网络-计算机网络体系结构-应用层

目录 一、网络应用模型 客户/服务器模型(Client/Server) P2P模型(Peer-to-peer) 二、域名解析系统(DNS) 域名 域名服务器 解析过程 三、文件传输协议(FTP) FTP控制原理 四、电子邮件 组成结构 协议 SMTP MIME POP3 IMAP 五、万维网和HTTP协议 概述 HTTP 报…

程桌面管理软件Apple Remote Desktop mac中文介绍说明

Apple Remote Desktop mac是一款远程桌面管理软件。它可以让用户通过局域网或互联网连接到其他远程计算机&#xff0c;并实时监控和管理这些计算机。 使用Apple Remote Desktop&#xff0c;用户可以轻松远程操作和控制其他计算机的桌面。用户可以在远程计算机上查看、操控和键入…

WPF Material Design UI框架

前言 Material Design in xaml 是开源免费的ui框架&#xff0c;工控软件主打的就是简单界面。 以下简称MD 相关资源 MaterialDesignInXamlToolkit Github 地址 MD 快速启动 MD 案例压缩包 MD 框架使用 启动环境配置 安装Nuget包 App.xaml 配置 <Application x:Class&qu…

我用GPT4 预测了10年后中国大学排名Top10

目录 前言 &#x1f3eb;预测大学排名 &#x1f525; GPT4 预测排名的理由 最后 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;杂谈&#x1f91d;希望作者的文章能…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

海思专业级图像分析处理边缘计算盒子,双核A55 64位处理器+2.5TOPS算力

随着大模型、物联网等技术的快速发展&#xff0c;边缘计算逐渐成为了当今信息技术领域的研究热点&#xff0c;边缘算力的重要性愈加凸显。据市场需求反馈&#xff0c;大量长尾场景普遍具有小型化、灵活多变、即时性等特点&#xff0c;更需要关注算力的利用率、以及方案的成本、…

macOS telnet替代方式

前言 经过使用Linux&#xff0c;常常用Linux的telnet查看端口畅通&#xff0c;是否有防火墙&#xff0c;但是在mac上已经没有这个命令了&#xff0c;那么怎么使用这个命令或者有没有其他替代呢&#xff0c;win和linux是否可以使用相同的替代。macOS可以原生用nc命令替代&#…

公司电脑屏幕录制软件有什么功能

电脑屏幕录制软件有很多&#xff0c;今天简单说说说它的基础功能和附属功能&#xff1a; 基础功能&#xff1a; 1、屏幕录像 支持对所选电脑的屏幕进行录制&#xff0c;并且支持调整截屏频度、画面质量、单个视频时长等。 2、实时屏幕 可以对对方电脑进行实时屏幕查看&…

深入探究Selenium定位技巧及最佳实践

在使用Selenium进行Web自动化测试时&#xff0c;准确地定位元素是非常重要的一步。Selenium提供了多种元素定位方法&#xff0c;本文将深入探究这八大元素定位方法&#xff0c;帮助读者更好地理解和应用Selenium的定位技巧。 1. ID定位 ID是元素在HTML中的唯一标识符&#xff…

转载--关闭onenote2013 /中点击超链接(指向本地文件夹)后出现的安全声明 / Microsoft onenote2021 安全声明关闭

作者&#xff1a;匿名用户 链接&#xff1a;https://www.zhihu.com/question/32472113/answer/133076766以下为内容&#xff1a; 早上看到 第22条军规 的答案&#xff0c;果然很牛逼&#xff0c;感谢您。然后发现他的答案下面有人说不会用&#xff0c;所以我就写了一个包含图…

uniapp解决iOS切换语言——原生导航栏buttons文字不生效

uniapp 切换语言原生导航栏buttons文字不生效&#xff1f; 文章目录 uniapp 切换语言原生导航栏buttons文字不生效&#xff1f;效果图page.json配置解决方式 效果图 场景&#xff1a;在 tabbar 页面中&#xff0c;配置 原生导航栏 buttons &#xff0c;切换语言时&#xff0c;不…

微信小程序 picker-view 组件构建一个上下拖动选择器

picker-view是官方的一个选择器组件 支持多级选择 当然也可以单项选择 我们先来看看是个什么东西吧 简单写一个 wxml代码 <view><picker-view bindchange"pickerChange" style"width: 300rpx; height: 200rpx; font-size: 20px;"><!-- pic…

qt的一些自绘控件

https://download.csdn.net/download/venice0708/88469835