Stream流(JAVA笔记第三十三期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

目录

  • Stream流的使用步骤
  • 获取Stream流
  • Stream流的中间方法
  • Stream中的终结方法
    • 收集方法collect


Stream流可以比作工厂的流水线

Stream流的概念

Stream流的使用步骤

  1. 先得到一条Stream流(可以比作一条流水线),并把数据放上去
  2. 利用Stream流中的API进行各种操作,如过滤、转换、统计、打印等。其中前两种称为中间方法(方法调用完毕之后,还可以调用其他方法),后两者称为终结方法(最后一步,方法调用完毕之后不能再调用其他方法)

所以Stream流的使用步骤为

  1. 先得到一条Stream流(可以比作一条流水线),并把数据放上去
    .
  2. 使用中间方法对流水线上的数据进行操作
    .
  3. 使用终结方法对流水线上的数据进行操作

获取Stream流

在这里插入图片描述
双列集合keySet()或者entrySet()只能先转成Set单列集合在使用Stream流

举例说明

import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) {//单列集合获取Stream流ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"a","b","c","a");//取一条Stream流,并把list集合里的数据放在Stream流上Stream<String> stream = list.stream();//使用终结方法打印Stream流上的所有数据stream.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});System.out.println();//其上可以简化成如下代码list.stream().forEach(s -> System.out.println(s));//================================================System.out.println("================================================");//双列集合获取Stream流HashMap<String,Integer> hm = new HashMap<>();hm.put("张三",18);hm.put("李四",20);hm.put("王五",19);//第一种获取Stream流hm.keySet().stream().forEach(s -> System.out.println(s));//第二种获取Stream流hm.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));//================================================System.out.println("================================================");//数组获取Stream流int []arr = {1,2,3,4,5,6,7,8,};String []arr1 = {"张三","李四"};//获取Stream流Arrays.stream(arr).forEach(s-> System.out.println(s));Arrays.stream(arr1).forEach(s-> System.out.println(s));//================================================System.out.println("================================================");//一堆零散的数据获取Stream流//  !!前提:数据类型必须相同!!Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));Stream.of("张三","李四").forEach(s-> System.out.println(s));//Stream接口中静态方法of的注意事项//方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组//但是数组必须是引用数据类型的,如果传递的是引用数据类型,是会把整个数组当作一个元素,放到Stream流中//若此时打印该数组,则会输出数组的地址值}
}

Stream流的中间方法

在这里插入图片描述
举例说明

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三","李四","张旺财","张二","李四五","王五");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"李四","张军","张军","王五");ArrayList<String> list3 = new ArrayList<>();Collections.addAll(list3,"李四-18","张军-20","张军-19","王五-22");//filter 过滤/*    list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果返回值为true,表示当前数据留下。反之舍去return s.startsWith("张");}}).forEach(s -> System.out.println(s));*///filter 过滤list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(s -> System.out.println(s));System.out.println("==============================");//limit 获取前几个元素list.stream().limit(3).forEach(s -> System.out.println(s));System.out.println("==============================");//skip  跳过前几个元素list.stream().skip(3).forEach(s -> System.out.println(s));System.out.println("==============================");//distinct  元素去重(依赖hashcode和equals方法)list2.stream().distinct().forEach(s -> System.out.println(s));System.out.println("==============================");//concat  合并a和b两个流为一个流Stream.concat(list.stream(),list2.stream()).forEach(s -> System.out.println(s));System.out.println("==============================");//map  转换流中的数据类型//String -> int//第一个数据类型:流中原本的数据类型//第二个数据类型:要转换成的数据类型list3.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {//返回值:表示转换之后的数据String[] arr = s.split("-");String ageString = arr[1];int age = Integer.parseInt(ageString);return age;}}).forEach(s-> System.out.println(s));System.out.println("==============================");list3.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));}
}

Stream中的终结方法

在这里插入图片描述
前三个方法举例说明如下

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;public class Demo3 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三","李四","张旺财","张二","李四五","王五");//foreach 遍历list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});System.out.println("==============================");//foreach 遍历list.stream().forEach(s-> System.out.println(s));System.out.println("==============================");//count 统计long count = list.stream().count();System.out.println(count);System.out.println("==============================");//toArray 收集数据并放到数组当中Object[] array = list.stream().toArray();System.out.println(Arrays.toString(array));System.out.println("==============================");//toArray 收集数据并放到数组当中//<? extends Object[]>:具体类型的数组//apply的形参:流中数组的个数,要跟数组的长度保持一致//apply的返回值:具体类型的数组//方法体:创建数组String[] array1 = list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(array1));//toArray方法的参数:负责创建一个指定类型的数组//toArray方法的底层:会依次得到流里面的每一个数据,并把数据放到数组当中//toArray方法的返回值:是一个装着流里面所有数据的数组System.out.println("==============================");//toArray 收集数据并放到数组当中String[] array2 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(array2));System.out.println("==============================");}
}

收集方法collect

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;public class DEMO4 {public static void main(String[] args) {//collect(Collector collector)  收集流中的数据,放到集合中(List、Set、Map)//注意点:如果我们要收集到Map集合中,键不能重复,否则会报错ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"李四-男-18","张军-男-20","张军-男-20","王五-女-22");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"李四-男-18","张军-男-20","王五-女-22");//收集所有男性并放在list集合里List<String> newList = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(newList);System.out.println("==============================");//收集所有男性并放在Set集合里Set<String> newSet = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(newSet);System.out.println("==============================");//收集所有男性并放在Map集合里//键为姓名,值为年龄Map<String, Integer> newMap = list2.stream().filter(s -> "男".equals(s.split("-")[1]))//第一个数据类型:流里面的数据类型//第二个数据类型:键的数据类型.collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}},      //第一个数据类型:流里面的数据类型//第二个数据类型:值的数据类型new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(newMap);System.out.println("==============================");/*总结:toMap:参数一表示键的生成规则参数二表示值的生成规则参数一:Function泛型一:表示流中每一个数据的类型泛型二:表示Map集合中键的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成键的代码返回值:已经生成的键参数二:Function泛型一:表示流中每一个数据的类型泛型二:表示Map集合中值的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成值的代码返回值:已经生成的值*///收集所有男性并放在Map集合里//键为姓名,值为年龄//简化Map<String, Integer> newMap2 = list2.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0],s ->Integer.parseInt(s.split("-")[2])));}
}

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

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

相关文章

基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统&#xff0c;用于预测用户对电影的评分。具体来说&#xff0c;该程序通过TensorFlow构建和训练一个模型&#xff0c;来学习用户和电影之间的隐含特征&#xff0c;并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述&#xff1a; …

Python学习从0到1 day27 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求&#xff1a; 解答 总结 去重函数&#xff1a; 过滤函数&#xff1a; 转换函数&#xff1a; 排…

「Mac玩转仓颉内测版2」入门篇2 - 编写第一个Cangjie程序

本篇详细介绍在Mac系统上创建首个Cangjie项目并编写、运行第一个Cangjie程序的全过程。内容涵盖项目创建、代码编写、程序运行与调试&#xff0c;以及代码修改后的重新运行。通过本篇&#xff0c;掌握Cangjie项目的基本操作&#xff0c;进一步巩固开发环境的配置&#xff0c;迈…

[Docker#2] 发展历史 | Namespace环境隔离 | Cgroup资源控制

目录 1.发展历史 Jail 时代 云时代 云原生时代 技术标准的确立 虚拟机 vs Docker 2. 容器化技术 2.1 Namespace 命令详解 1. dd 命令 2. mkfs 命令 3. df 命令 4. mount 命令 5. unshare 命令 实战 进程隔离 文件隔离 2.2 CGroup 相关命令 2.1 pidstat 2.…

计算机网络:网络层 —— 软件定义网络 SDN

文章目录 软件定义网络 SDN远程控制器OpenFlow协议SDN 广义转发流表简单转发负载均衡防火墙 SDN 控制器 软件定义网络 SDN 软件定义网络&#xff08;Software Defined Networking&#xff0c;SDN&#xff09;是一种新兴的网络架构&#xff0c;旨在通过网络控制与数据转发的分离…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求&#xff1a; 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装&#xff1a; 1.设置软件源&#xff1a; 官方提供的软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

如何处理模型的过拟合和欠拟合问题

好久没有写人工智能这块的东西了&#xff0c;今天正好在家休息&#xff0c;给大家分享一下最近在训练时遇到的过拟合和欠拟合的问题&#xff0c;经过仔细的思考&#xff0c;总结如下&#xff1a; 在处理模型的过拟合和欠拟合问题时&#xff0c;我们需要根据具体情况采取不同的…

GoLang协程Goroutiney原理与GMP模型详解

本文原文地址:GoLang协程Goroutiney原理与GMP模型详解 什么是goroutine Goroutine是Go语言中的一种轻量级线程&#xff0c;也成为协程&#xff0c;由Go运行时管理。它是Go语言并发编程的核心概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。 以下是一些…

“穿梭于容器之间:C++ STL迭代器的艺术之旅”

引言&#xff1a; 迭代器&#xff08;Iterator&#xff09;是C STL&#xff08;标准模板库&#xff09;中非常重要的一部分&#xff0c;它提供了一种统一的方式来遍历容器中的元素。无论容器是数组、链表、树还是其他数据结构&#xff0c;迭代器都能够以一致的方式访问这些数据…

opencv实时弯道检测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

智谱AI视频生成模型CogVideoX v1.5开源 支持5/10秒视频生成

今日&#xff0c;智谱技术团队发布了其最新的视频生成模型 CogVideoX v1.5&#xff0c;并将其开源。这一版本是自8月以来&#xff0c;智谱技术团队推出的 CogVideoX 系列中的又一重要进展。 据了解&#xff0c;此次更新大幅提升了视频生成能力&#xff0c;包括支持5秒和10秒的视…

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38195 股票市场在经济发展中占据重要地位。由于股票的高回报特性&#xff0c;股票市场吸引了越来越多机构和投资者的关注。然而&#xff0c;由于股票市场的复杂波动性&#xff0c;有时会给机构或投资者带来巨大损失。考虑到股票市场的…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强&#xff0c;就算受伤&#xff0c;我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码…

数据结构:跳表实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist&#xff0c;平衡搜索树&#xff0c;哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质&#xff0c;对外提供参数。 更改调制不同的参数&#xff0c;生成不同的材质实例。 类似于&#xff0c;类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

Kotlin 协程使用及其详解

Kotlin协程&#xff0c;好用&#xff0c;但是上限挺高的&#xff0c;我一直感觉自己就处于会用&#xff0c;知其然不知其所以然的地步。 做点小总结&#xff0c;比较浅显。后面自己再继续补充吧。 一、什么是协程&#xff1f; Kotlin 协程是一种轻量级的并发编程方式&#x…

HDFS和HBase跨集群数据迁移 源码

HDFS集群间数据迁移&#xff08;hadoop distcp&#xff09; hadoop distcp \ -pb \ hdfs://XX.14.36.205:8020/user/hive/warehouse/dp_fk_tmp.db/ph_cash_order \ hdfs://XX.18.32.21:8020/user/hive/warehouse/dp_fksx_mart.db/HBase集群间数据&#xff08;hbase ExportSnap…

多态(c++)

一、概念 多态分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;函数重载和函数模板就是编译时多态&#xff0c;它们传不同的类型的参数就可以调用不同的函数&#xff0c;通过参数不同达到多种形态&#xff0c;因为它们…

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

目录 一、索引的概念、作用。 &#xff08;1&#xff09;介绍。 &#xff08;2&#xff09;为啥索引能优化sql查询&#xff1f; 1、某张表(emp)结构以及数据如下。 2、假如执行的SQL语句为&#xff1a;select * from emp where empno7844; 3、对比与总结。 &#xff08;3&#…