Stream 流对象的创建与各方法

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);}
}

运行结果如下:

    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);}
}

 实现List数组用逗号分隔开,转成字符串

List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");String str = list.stream().collect(Collectors.joining(","));System.out.println(str); //输出结果为 a,b,c,d

运行结果如下:

二.收集到 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));}
}

运行结果如下:

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

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

相关文章

《算法设计与分析》 蛮力法实验报告一

1.&#xff08;洛谷 P1008&#xff09;将 1,2...9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3 的比例,试求出所有满足条件的三个三位数。 输入格式&#xff1a; 无 输出格式&#xff1a; 若干行&#xff0c;每行 3 个数字。按照每行第 1 个数字升序…

vue基于ElementUI/Plus自定义的一些组件

vue3-my-ElementPlus 源码请到GitHub下载使用MyTable、MySelect、MyPagination 置顶|Top | 使用案例&#xff1a; 1.0 定义表格数据&#xff08;测试使用&#xff09; data() {return {tableData: [],value:[],valueList: [],}; },// 构造表格测试数据// 1 第一行&#xf…

基于nodejs+vue客户管理管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

【设计模式】第6节:创建型模式之“原型模式”

由于本人现在所使用的语言主要是golang&#xff0c;所以后面的代码主要使用golang编写。语言实现应该不是障碍&#xff0c;主要是理解每种设计模式它的思想。 如果对象的创建成本比较大&#xff0c;而同一个类的不同对象之间差别不大&#xff08;大部分字段都相同&#xff09;…

C/C++苹果和虫子 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C苹果和虫子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C苹果和虫子 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 你买了一箱n个苹果&#xff0c;很不幸的是买完时箱…

数据结构与算法之美学习笔记:15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?

目录 前言无处不在的二分思想O(logn) 惊人的查找速度二分查找的递归与非递归实现二分查找应用场景的局限性解答开篇内容小结 前言 本节课程思维导图&#xff1a; 今天我们讲一种针对有序数据集合的查找算法&#xff1a;二分查找&#xff08;Binary Search&#xff09;算法&am…

win10 + vs2017 + gdal2.0.3 编译

1. 下载并解压gdal2.0.3 我的放置目录是&#xff1a;D:\Depend_3rd_party\gdal2\gdal-2.0.3&#xff0c;其中gdal-2.0.3是解压得到的文件夹 2. 修改 nmake.opt 文件 用notepad打开nmake.opt文件&#xff0c;修改以下三个部分&#xff1a; &#xff08;1&#xff09;修改C co…

程序员想要网上接单却看花了眼?那这几个平台你可得收藏好了!

现在经济压力这么大&#xff0c;但是生活成本还在上升&#xff0c;相信大家都知道“四脚吞金兽”的威力了吧&#xff01;话虽如此&#xff0c;但是生活总得继续&#xff0c;为了家庭的和谐幸福&#xff0c;为了孩子的未来&#xff0c;不少人选择多干几份工作&#xff0c;赚点外…

Macroscope安全漏洞检测工具简介

学习目标&#xff1a; 本介绍旨在帮助感兴趣者尽快了解 Macroscope&#xff0c;这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试&#xff1a; 如下图所示&#xff0c;如果使用多种互补工具&#xff08;SAST/DAST/SCA 等&#xff09;来检测应用程序…

linux编译boost库并执行程序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、--prefix命令 二、安装过程 1、shell脚本&#xff1a; 2、gcc编译环境 执行过程 三、linux下执行cpp程序 总结 前言 提示&#xff1a;这里可以添加本文…

【Synopsys工具使用】VCS使用与Makefile脚本调用

文章目录 一、文件导入二、VCS仿真&#xff08;使用可视化界面&#xff09;三、VCS仿真&#xff08;使用Maefile文件&#xff09;3.1 Makefile文件编写3.2 仿真文件编写规范3.3 Makefile文件使用 一、文件导入 新建一个文件夹新建一个文件夹(图中IC_work)   创建一个目录&…

3.18每日一题(奇偶性、奇偶性的平移、几何意义、配方、换元)

解法一&#xff1a;先配方&#xff0c;再用三角函数换元&#xff08;看见根号一般用三角函数&#xff09;&#xff0c;看见对称区间联想奇偶性&#xff0c;最后再用公式 解法二&#xff1a; 利用奇偶性的平移&#xff0c;令&#xff08;x-1&#xff09; t &#xff0c;对应的区…

项目实战:给首页上库存名称添加超链接然后带fid跳转到edit页面

1、提取公共方法common.js function $(key){if(key){if(key.startsWith("#")){key key.substring(1)return document.getElementById(key)}else{let nodeList document.getElementsByName(key)return Array.from(nodeList)}} } 2、 给库存名称添加超链接 2.1、inde…

力扣刷题 day63:11-02

1.字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 方法一&#xff1a;两次遍历哈希表 #方法一&#xff1a;两次遍历哈希表 def firstUniqChar(s):d{}for i in s:if …

数据库 | 看这一篇就够了!最全MySQL数据库知识框架!

大家好&#xff01; 作为一名程序员&#xff0c;每天和各种各样的“数据库”打交道&#xff0c;已经成为我们的日常。当然&#xff0c;立志成为一名超级架构师的我&#xff0c;肯定要精通这项技能。咳咳&#xff01;不过饭还是要一口一口吃的&#xff0c;“数据库”这个内容实在…

Linux Makefile变量详解

前言 我们是地球人。曾经为复杂的 Makefile 变量而苦恼过吗&#xff1f;这就是我们的用武之地。我们简化您的构建流程&#xff0c;以获得更快、更高效的结果。看看我们。 自 1976 年出现以来&#xff0c;Make 一直在帮助开发人员自动执行编译代码、构建可执行文件和生成文档的…

【Proteus仿真】【51单片机】贪吃蛇游戏

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用8*8LED点阵、按键模块等。 主要功能&#xff1a; 系统运行后&#xff0c;可操作4个按键控制小蛇方向。 二、软件设计 /* 作者&#xff1a;嗨小易…

Keil uv5 MDK使用教程

目录 前言一、开发环境搭建1.1 Keil的安装1.2 其他工具安装1.3 注意事项 二、Keil基本使用2.1 新建工程模板2.1.1 基于固件库&#xff08;先复制文件夹&#xff0c;后添加文件&#xff09;2.1.2 基于寄存器2.1.3 基于HAL库 2.2 下载与调试2.3 工程目录下简介2.4 MDK使用技巧 前…

JavaScript

文章目录 1、JavaScript 的历史1.1 JavaScript 的历史1.2 JavaScript与ECMAScript的关系1.3 JavaScript与Java的关系1.4 JavaScript的版本 2、JS的引入方式3、ECMAScript基本语法3.1 变量3.2 注释3.2 语句分隔符 4、ECMAScript 基本数据类型4.1 数字类型4.2 字符串4.2.1 创建4.…

【计算机网络】运输层

概述运输层服务 运输层协议为运行在不同主机上的应用程序提供了逻辑通信功能。 运输层协议是在端系统中而不是在路由器中实现的。 运输层和网络层的关系&#xff1a; 网络层提供主机之间的逻辑通信&#xff0c;而运输层为**运行在不同主机上的应用程序&#xff08;进程&#…