Java---Stream流详解

news2025/7/15 3:39:03

目录​​​​​​​

一、Stream流详解

二、Stream流的获取

(1)单列集合

(2)双列集合

(3)数组

(4)一些零散数据

三、Stream流中常用的API方法

(1)中间方法

(2)终结方法

(3)收集方法


一、Stream流详解

Stream流其实就相当于是工厂上的流水线,后面会对数据更好的进行操作,如打印,过滤等等。说到底把它比作是工厂上的流水线还是很形象的。

二、Stream流的获取

    获取方式       方法名                                          说明

  单列集合         default<E>stream()                            collection中的默认方法
  双列集合         无                                            无法直接使用stream流 
  数组             public static<T>Stream<T>stream(T[] array)    Array工具类的静态方法
  一堆零散数据     public static<T>Stream<T>of(T...values)       Stream接口中的静态方法

(1)单列集合

package article;
import java.util.*;
import java.util.Collection;
import java.util.*;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     ArrayList<String>s=new ArrayList<>();
     Collections.addAll(s, "opop","------","4er45","<>><><");
     s.stream().forEach(new Consumer<String>() {

		@Override
		public void accept(String t) {
			// TODO 自动生成的方法存根
			System.out.println(t);
		}
    	 
     });
     //接下来使用lambda表达式进行简化
     System.out.println("--------------------------------");
     s.stream().forEach(i->System.out.println(i));
   }
}

(2)双列集合

双列结合获取stream流有两种办法,一种是获取通过键获取,一种是通过键值来获取。

package article;
import java.util.*;
import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     HashMap<String,Integer> s=new HashMap<>();
     s.put("abs", 192);
     s.put("<<<<",200);
     s.put("[][][]", 10);
     
     //第一种通过键获取stream流
     s.keySet().stream().forEach(new Consumer<String>(){

		@Override
		public void accept(String t) {
			// TODO 自动生成的方法存根
			//t是键
			System.out.println("键="+t+" 值="+s.get(t));
			
		}
    	 
     });
     System.out.println("----------------------------------------------------");
     //第二种通过键值对获取
     s.entrySet().stream().forEach(new Consumer<Map.Entry<String, Integer>>() {

		@Override
		public void accept(Entry<String, Integer> t) {
			// TODO 自动生成的方法存根
			System.out.println("键="+t.getKey()+" 值="+t.getValue());
		}
    	 
     });
   }
}

(3)数组

package article;
import java.util.*;
import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     int[] a= {1,32,98,12,90};
     
     Arrays.stream(a).forEach(s->System.out.println(s));
   }
}

(4)一些零散数据

静态方法of可以=传递零散数据,也可以是一个数组,如果是基本数据类型数组,传递进去的是地址,引用数据类型则是值。

package article;
import java.util.*;
import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.stream.Stream;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     Stream.of("1",";").forEach(s->System.out.println(s));
     int[] a= {1,2,8};
     String[] b= {"klj",";;;"};
     Stream.of(a).forEach(s->System.out.println(s));
     Stream.of(b).forEach(s->System.out.println(s));
   }
}

三、Stream流中常用的API方法

(1)中间方法

修改stream流中的数据,但不会影响原来集合或者数组中的数据。这里建议使用链式编程。


Stream<T>filter(Predicate<?super T>predicate)   过滤
Stream<T>limit(long maxsize)                    获取前几个元素
Stream<T>skip(long n)                           跳过前几个元素
Stream<T>distinct()                             元素去重,以来hashcode和equals方法,自定义类时记得重写hashcode和equals
static<T>Stream<T>concat(Stream a,Stream b)     合并a和b两个流为一个;流
Stream<R>map(Function<T,R>mapper)               转换流中的数据类型
package article;
import java.util.*;

import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     ArrayList<String> s=new ArrayList<>();
     Collections.addAll(s,"张三丰","周芷若","赵敏","张强","张无忌","张翠山","张亮","王二麻子","谢广坤");
     
     //第一个使用filter过滤,假如得到所有姓张的
     s.stream().filter(new Predicate<String>() {

		@Override
		public boolean test(String t) {
			// 如果返回值是true,表示该数据留下
			if(t.startsWith("张")) {
				return true;
			}
			return false;
		}
    	 
     }).forEach(i->System.out.print(i+" "));
     System.out.println();
     
     //filter使用lambda表达式简写,我也推荐大家这样写,简单一点
     System.out.println("lambda写法:姓张并且长度=3----------------------");
     s.stream()
     .filter(i->i.startsWith("张"))
     .filter(i->i.length()==3)
     .forEach(i->System.out.print(i+" "));
     System.out.println();
   
     System.out.println("limit的使用");
     //第二个limit获取前几个元素
     System.out.println("获取stream中的前面两个元素:");
     s.stream().limit(2).forEach(i->System.out.print(i+" "));
     System.out.println();
    
     System.out.println("skip的使用");
     //第三个skip跳过前面几个元素
     System.out.println("跳过前面7个元素,也就是获得后面两个元素:");
     s.stream().skip(7).forEach(i->System.out.print(i+" "));
     System.out.println();
     
     System.out.println("distinct的使用:");
     //第四个distinct元素去重,依赖hashcode和equals(自定义对象记得重写)
     ArrayList<String> list=new ArrayList<>();
     Collections.addAll(list, "张三丰","张三丰","周芷若","赵敏","张强","张无忌","张翠山","张亮","王二麻子","谢广坤");
     list.stream().distinct().forEach(i->System.out.print(i+" "));
     System.out.println();
     
     System.out.println("concat的使用");
     //第五个使用concat将a,b两个流合并成为一个流,注意这里两个流中的数据类型建议是一样的,不一样合并之后则是它们共同父类的数据类型
     ArrayList<String> list1=new ArrayList<>();
     Collections.addAll(list1, "-=-=","[][][");
     Stream.concat(list1.stream(),s.stream()).forEach(i->System.out.print(i+" "));
     System.out.println();
     
     System.out.println("map的使用:");
     //第六个使用map转换流中的数据类型
     //比如来个需求现在想要下面集合中的年龄
     //这里注意一下map方法执行了以后,流上的数据就变成了整数,不在是之前的字符串了,所以后面的forEach打印出来的是数字
     ArrayList<String> list2=new ArrayList<>();
     Collections.addAll(list2,"张无忌-15","周芷若-18","王柳-100","段誉-98");
     list2.stream().map(i->Integer.parseInt(i.split("-")[1]))
     .forEach(i->System.out.print(i+" "));
     System.out.println();
  }
}

 

 

(2)终结方法

终结方法是什么呢,与中间方法有什么区别吗?没什么大的区别,都是方法,只不过终结方法使用过后就不能再对流进行操作了,它是对流做的最后一次操作了。


void forEach()            遍历
long count()              统计
toArray()                 收集流中的数据,放到数组中
package article;
import java.util.*;

import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     ArrayList<String> s=new ArrayList<>();
     Collections.addAll(s,"张三丰","周芷若","赵敏","张强","张无忌","张翠山","张亮","王二麻子","谢广坤");
     
     String[] a=s.stream().toArray(new IntFunction<String[]>() {
        //这里的IntFunction中的类型就是要转换成的数组类型
    	//apply中的value是流中的数据个数,要和数组长度保持一致
    	 //apply的返回值是具体类型的数组
		@Override
		public String[] apply(int value) {
			// TODO 自动生成的方法存根
			return new String[value];
		}
    	 
     });
     System.out.println(Arrays.toString(a));
     
     //lambad表达式
     String[] b=s.stream().toArray((i)->{
    	 return new String[i];
   });
     System.out.println(Arrays.toString(b));
     
  }
}

 

(3)收集方法

collect()                 收集流中的数据,放到集合(list,set,map)中

注意啊,collect()也是终结方法使用了它之后后面就不能在使用其它什么了。

package article;
import java.util.*;

import java.util.Collection;
import java.util.Map.Entry;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntConsumer;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.*;
import java.util.*;
public class first {
   public static void main(String[] args) {
     ArrayList<String> s=new ArrayList<>();
     Collections.addAll(s,"张无忌-男-15","张无忌-男-15","周芷若-女-14","赵敏-女-13","张强-男-29","张三丰-男-100","张翠山-男-40","王五-男-66","谢逊-女-87");
     
     //第一个:收集到list集合中,这里的tolist底层是用ArrayList实现的
     //需求收集性别是男的,姓张的
     List<String> list1=s.stream().filter(i->i.startsWith("张"))
    		 .filter(i->"男".equals(i.split("-")[1]))
    		 .collect(Collectors.toList());
     System.out.println(list1);
     
     //第二个:收集到Set集合中,与List集合不同的是Set集合不允许重复
     //这里的toSet方法底层是通过HashSet实现的
     Set<String> list2=s.stream().filter(i->"男".equals(i.split("-")[1]))
    		 .filter(i->i.startsWith("张"))
    		 .collect(Collectors.toSet());
     System.out.println(list2);
     
     //第三个:收集到Map集合中,这里有一个注意点,键值一定不能重复,否则报错
     //我们要确定哪个是键哪个是值
     //这里我们将名字确定为键,年龄确定是值
     //
     ArrayList<String> li=new ArrayList<>();
     Collections.addAll(li,"张无忌-男-15","周芷若-女-14","赵敏-女-13","张强-男-29","张三丰-男-100","张翠山-男-40","王五-男-66","谢逊-女-87");
     
     Map<String,Integer> ma=li.stream().filter(i->i.startsWith("张"))
    		 .filter(i->"男".equals(i.split("-")[1]))
    		 .collect(Collectors.toMap(new Function<String,String>(){
//这里的toMap中的第一个参数是键的规则,第二个参数是值的规则
    			 //第一个参数的第一个参数是流的类型,第二个是转换的键的类型,第二个同样如此
    			 //返回值就是转换后的
				@Override
				public String apply(String t) {
					// TODO 自动生成的方法存根
					return t.split("-")[0];
				}
    			 
    		 }, new Function<String,Integer>(){

				@Override
				public Integer apply(String t) {
					// TODO 自动生成的方法存根
					return Integer.parseInt(t.split("-")[2]);
				}
    			 
    		 }));
     System.out.println(ma);
  }
}

​​​​​​​

 

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

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

相关文章

含可再生能源的热电联供型微网经济运行优化_粒子群PSO算法_matlab程序

含可再生能源的热电联供型微网经济运行优化matlab程序 参考文献&#xff1a;含可再生能源的热电联供型微网经济运行优化 热电联供系统具有节能! 环保! 经济等特点" 有着良好的发展前景和应用价值# 文中针对由 风电机组! 光伏电池! 燃料电池! 余热锅炉! 燃气锅炉! 蓄电池以…

含电热联合系统的微电网运行优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

SpringBoot+Vue项目投稿和稿件处理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

MYSQL中的锁

全局锁 就是对整个数据库进行加锁&#xff0c;加锁之后整个数据库就处于只读状态&#xff0c;后续的DML写语句&#xff0c;DDL语句&#xff0c;以及对更新事务的提交操作都会被阻塞&#xff0c;典型地使用场景就是做整个数据库的逻辑备份&#xff0c;对所有的表进行锁定&#x…

非凡社群管理之如何高效的进行社群管理

一、初始成员的严格筛选 我们建立社群初期&#xff0c;就要严格筛选初始会员&#xff0c;争取让我们找到的第一批种子用户&#xff0c;就是有着共同的连接点。而不是找到一群人之后&#xff0c;再去培养大家的同好。这样不仅吃力不讨好&#xff0c;往往效果也不太高&#xf…

Kafka系列之:实现Kafka Connect集群访问认证

Kafka系列之:实现Kafka Connect集群访问认证 一、Kafka Connect访问控制二、Kafka Connect技术知识三、详细介绍Kafka connect访问认证实现过程四、启动Kafka Connect集群五、测试Kafka Connect集群访问认证一、Kafka Connect访问控制 实现的效果如下所示: 错误的用户名和密…

nginx降权及匹配php

1.nginx降权 1.1 capabilities的介绍与运用 1.2 用普通用户启动nginx 1.3 root用户权限赋予 1.4 查看普通用户的nginx权限 1.5 查看nginx的欢迎网页 2.nginx与php的相互匹配 2.1 安装php及php-fpm包 2.2 检查php-fpm服务运行状态 2.3 php-fpm上的配置 2.4 nginx上的配…

基于matlab的精馏塔作业模拟仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 原料物性表如下&#xff1a; 表3-1原料物理性质表 组分 质量流率 质量分数 摩尔流率 摩尔分数 分子量 常压沸点 丙烷 472.938 7.567…

SpringBoot SpringBoot 原理篇 1 自动配置 1.9 bean 的加载方式【七】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.9 bean 的加载方式【七】1.9.1 ImportBeanDefinitionRegistrar1 …

mysql 到底是 join性能好,还是in一下更快呢

先总结&#xff1a; 数据量小的时候&#xff0c;用join更划算数据量大的时候&#xff0c;join的成本更高&#xff0c;但相对来说join的速度会更快数据量过大的时候&#xff0c;in的数据量过多&#xff0c;会有无法执行SQL的问题&#xff0c;待解决 事情是这样的&#xff0c;去…

浅谈Spring Cloud Gateway源码

本文不谈Spring Cloud Gateway相关的使用&#xff0c;仅梳理在微服务项目中&#xff0c;在使用Spring Cloud Gateway做为服务网关后&#xff0c;接收到请求后的大体执行流程。 文章目录大致流程图具体流程一、DispatcherHandler二、getHandler1、getHandlerInternal2、lookupRo…

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

文章目录 一、路径剖面简介二、创建剖面图1. 加载DEM2. 创建剖面图3. 计算填挖方3. 保存剖面图一、路径剖面简介 路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。 要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击…

[acwing周赛复盘] 第 60 场周赛20220716

[acwing周赛复盘] 第 60 场周赛20220716 一、本周周赛总结二、 4722. 数列元素1. 题目描述2. 思路分析3. 代码实现三、4723. 队列1. 题目描述2. 思路分析3. 代码实现四、4724. 靓号1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 第一次打acwing&#xff0c;…

POJ1007:DNA排序

一、Description One measure of unsortedness in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence DAABEC’‘, this measure is 5, since D is greater than four letters to its ri…

傻白入门芯片设计,典型的2D/2D+/2.5D/3D封装技术(六)

集成电路终于成为了一级学科&#xff0c;对集成电路领域的投入也日益加大&#xff0c;集成电路属于电子集成技术的一种&#xff0c;那么&#xff0c;现在的电子集成技术发展到了什么程度呢&#xff1f; 先进的电子集成技术可以在不到芝麻粒大小的1平方毫米内集成1亿只以上的晶体…

Tableau 合集3:格式设置之可视化图显示百分比和提示工具对齐问题

一、前言 本文通过可视化图中显示不了百分比和提示工具无法对齐两个小问题出发&#xff0c;介绍了关于Tableau设置格式和工具提示的一些使用方法。 环境&#xff1a;Windows11 64位、Tableau desktop 2021.2 二、问题1&#xff1a;可视化图中显示不了百分比 问题描述&#…

springboot整合其它项目(连接池和监控)

目录 一、整合Druid 1. Druid是什么&#xff1f; 2.如何在Spring Boot中集成Druid连接池和监控&#xff1f; 二、整合Redis 1.集成redis之非注解式开发 2.集成redis之注解缓存开发 一、整合Druid 1. Druid是什么&#xff1f; Druid是Java语言中最好的数据库连接池。…

paddleocr识别模型训练记录

准备数据集 自己新建目录 下载识别预训练模型 下载之后是一个压缩包&#xff0c;解压后&#xff08;注意&#xff1a;rec是自己新建的目录&#xff09; 修改配置文件 修改内容&#xff1a; 1.训练后模型存储目录&#xff1b; 2.是否训练可视化&#xff1b; 3.训练数据集图…

tensorflow2 minist手写数字识别数据训练

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、tenosrflow minist手写数字识别代码二、输出三、参考资料总结前言 刚开始学习tensorflow&#xff0c; 首先接触的是minist手写数字识别&#xff0c;用的梯度下降算法&#xff0c;…

linux下mysql的三种安装方法

目录1. 离线安装&#xff08;.tar.gz安装包&#xff09;2. 离线安装&#xff08;rpm安装包&#xff09;3. 在线安装&#xff08;yum安装&#xff09;前言安装环境 : Redhat Enterprise Linux 81. 离线安装&#xff08;.tar.gz安装包&#xff09; 参考这篇博客 2. 离线安装&am…