Stream 流对象的创建与各方法

news2024/11/26 8:29:10

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.coloradmin.cn/o/1161033.html

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

相关文章

Jupyter notebook如何加载torch环境

默认你已经安装了anaconda 和 pytorch 环境。 1&#xff0c;必须要以管理员身份打开 Anaconda prompt终端&#xff0c; 2&#xff0c;进入pytorch环境中&#xff1a; conda activate pytorch_393&#xff0c;安装必要插件&#xff1a; &#xff08;1&#xff09;conda inst…

【力扣】2003. 每棵子树内缺失的最小基因值

【力扣】2003. 每棵子树内缺失的最小基因值 文章目录 【力扣】2003. 每棵子树内缺失的最小基因值1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一棵根节点为 0 的 家族树 &#xff0c;总共包含 n 个节点&#xff0c;节点编号为 0 到 n - 1 。 给你一个下标从 0…

国密SM算法及实现加密和解密

一 引入pom <dependency><groupId>com.antherd</groupId><artifactId>sm-crypto</artifactId><version>0.3.2</version></dependency> 二 代码实现 package com.example.ytyproject.component;import com.antherd.smcrypto.…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

在前端实现小铃铛上展示消息

点击铃铛显示如下消息框&#xff1a; 如果点击消息&#xff0c;可以实现消息从列表中移除,并从铃铛总数上进行扣减对应的已读消息数。 关于以上功能的实现方式&#xff1a; <!-- 铃铛位置 --><i class"el-icon-bell" click"showPopover true"&…

torch_geometric,scatter,sparse, cluster的安装失败

首先&#xff0c;对于自己的电脑环境是 已将安装3.9版本的python&#xff0c;成功安装11.6版本的cuda和1.31.1版本的torch。 现在想要安装torch_geometric&#xff0c; -需要先安装scatter&#xff0c;sparse&#xff0c; cluster。 直接安装失败&#xff0c;报错如下&…

小程序https证书

小程序通常需要与服务器进行数据交换&#xff0c;包括用户登录信息、个人资料、支付信息等敏感数据。如果不使用HTTPS&#xff0c;这些数据将以明文的方式在网络上传输&#xff0c;容易被恶意攻击者截获和窃取。HTTPS通过数据加密来解决这个问题&#xff0c;确保数据在传输过程…

make工具的介绍,包含的显示/隐晦规则/变量定义/文件指示,使用,.PHONY的介绍+原理

目录 make--自动化构建工具 引入 介绍 包含 显式规则 隐晦规则 变量定义 文件指示 注释 使用 test:test.c .PHONY 介绍 作用 示例 原理 示例 介绍 make--自动化构建工具 引入 在软件开发过程中&#xff0c;通常需要编译、链接和构建大量的源代码文件如果全…

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…

栈及其栈的模拟实现和使用

1. 栈(Stack) 1.1 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则…

【计算机网络】计算机网络中的基本概念

文章目录 局域网LAN基于网线直连基于集线器组建基于交换机组建基于交换机和路由器组建 广域网WANIP地址端口号协议为什么要有协议知名协议的默认端口 五元组协议分层TCP/IP五层模型封装和分用 网络互连就是将多台计算机连接在一起&#xff0c;完成数据共享。数据共享本质是网络…

echarts实现圆形进度图

echarts实现圆形进度图 效果图 话不多说&#xff0c;代码如下 option {title: {text: 本月功率因数,textStyle: {color: #666666,fontSize: 14},subtext: 0.95,subtextStyle: {color: #161616,fontSize:30,fontWeight:700},itemGap: 15, // 主副标题距离left: center,top:…

竞赛知识点11【线段树】

文章目录 一、概念二、基本操作2.1、建树2.2、区间询问操作2.3、单点修改2.4、区间修改一、概念 线段树是用一种树状结构来存储一个连续区间的信息的数据结构。 它主要用于处理一段连续区间的插入,查找,统计,查询等操作。 复杂度: 设区间长度是 n n n,所有操作的复杂度是 l…

Web渗透编程语言基础

Web渗透初学者JavaScript专栏汇总-CSDN博客 Web渗透Java初学者文章汇总-CSDN博客 一 Web渗透PHP语言基础 PHP 教程 | 菜鸟教程 (runoob.com) 一 PHP 语言的介绍 PHP是一种开源的服务器端脚本语言,它被广泛用于Web开发领域。PHP可以与HTML结合使用,创建动态网页。 PHP的特…

在Photoshop中如何校正倾斜的图片

在Photoshop中如何校正倾斜的图片呢&#xff1f;今天就教大家如何操作。 将需要操作的图片拉到PS软件中&#xff0c;自动形成项目。 点击上方“滤镜”中的“镜头校正”。 进入“镜头校正”窗口&#xff0c;点击左侧的“拉直工具”。文章源自设计学徒自学网-http://www.sx1c.co…

Shell module

案例 案例1概述 #!/bin/bash if [ -z "${NEXUS_ID}" ] || [ -z "${NEXUS_VERSION}" ]; thenecho "the length of NEXUS_ID or NEXUS_VERSION is zero"echo "NEXUS_ID: ${NEXUS_ID}"echo "NEXUS_VERSION: ${NEXUS_VERSION}"…

CentOS 搭建 Hadoop3 高可用集群

Hadoop FullyDistributed Mode 完全分布式 spark101spark102spark103192.168.171.101192.168.171.102192.168.171.103namenodenamenodejournalnodejournalnodejournalnodedatanodedatanodedatanodenodemanagernodemanagernodemanagerrecource managerrecource managerjob hist…

2. 网络之网络编程

网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法&#xff1a; 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…

USART HMI串口屏+GPS模块显示时间和经纬度

USART HMI串口屏GPS模块显示时间和经纬度 &#x1f4cd;相关篇《基于u-box GPS模块通过串口指令调整输出信息》 &#x1f4cb;在不使用其他单片机做数据中转处理情况下&#xff0c;利用USART HMI串口屏主动解析模式&#xff0c;来接收并解析GPS模块数据并显示&#xff0c;功能包…

Android 如何在Android studio中快速创建raw和assets文件夹

一 方案 1. 创建raw文件夹 切成project浏览模式——>找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有&#xff0c;直接在右侧输入框中出现的路径~\res后面加上\raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件&#xff0…