Java中的Stream流常用接口和方法

​@TOC

第一章:Stream流是什么

1.1)简单介绍

学习Stream流就绕不开Lambda表达式,

需要了解Lambda表达式可以看一下这篇–>:Lambda表达式学习

1.其实“流”是个抽象概念,我们把现实世界中与Stream流有相同特性的东西也称为“流”,比如水流,流水线。流的思想就像工厂中的“生产流水线”,将集合或数组中的元素当做流水线上的产品进行操作。

2.既然是操作计算数据那么这些数据的源头是什么?可以是数组、文件、集合、函数。注意:Stream流不保存数据,不是容器。更贴切的比喻是流水线,产品只是经过流水线而不保存在流水线上。

1.2)创建流的五种方式

①直接用方法创建

Stream s = Stream.of(1,2,3,4,5,6,7);

②根据集合创建

//创建集合
ArrayList<String> list = new ArrayList<>();
//添加元素
Collections.addAll(list,"张三","李四","张五极","张六六","张七八九");

//流对象创建
Stream<String> lisStream = list.Stream();

③根据数组,要注意数组存储的数据类型,这里生成的流是数值流。mapToInt、mapToDouble、mapToLong可以将对象流转换成对应的数值流,而boxed方法可以把数值流转换为对象流。

int[] intArr = {1,2,3,4,56};

// 因为是int数组  所以变成了IntStream 
IntStream arrayStream = Arrays.stream(intArr);

④根据文件,通过Files.line方法,得到的每个流是给定文件中的一行

//这个是我百度的
try {
            Stream<String> fileStream = Files.lines(Paths.get("data.txt"), Charset.defaultCharset());
        } catch (IOException e) {
            e.printStackTrace();
        }

⑤函数创建

第一种函数iterate

方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为iterator生成的流为无限流,通过limit方法对流进行了截断,只生成5个偶数

第二种函数generate

generate方法接受一个参数,方法参数类型为Supplier ,由它为流提供值。generate生成的流也是无限流,因此通过limit对流进行了截断

//第一种iterate
Stream<Integer> iterateStream = Stream.iterate(0, n -> n + 2).limit(5);

//第二种generate
Stream<Double> generateStream = Stream.generate(() -> Math.random()).limit(5);

第二章、Stream流的应用

Java8中提供了方便的一些流操作(比如过滤、排序之类的),从应用中体会Stream流,从案例中了解它的特点和应用场景

2.1)Stream流中的函数式接口Predicate

1.使用Stream流操作集合中的数据,创建集合后创建流对象

//创建集合
ArrayList<String> list = new ArrayList<>();
//添加元素
Collections.addAll(list,"张三","李四","张五极","张六六","张七八九");

//流对象创建
Stream<String> lisStream = list.Stream();

2.使用filter()方法,参数是函数式接口Predicate,所以可以使用Lambda表达式(不会的可以看文章开头有提到),方法介绍如下:

filter​(Predicate<? super T> predicate) 返回由与此给定谓词匹配的此流的元素组成的流Stream<T> 。

//创建流对象
  Stream<String> stream = list.stream();
//筛选所有姓张的人,并返回满足此条件的元素组成的流
  Stream<String> stream1 = stream.filter(name -> name.startsWith("张"));
//筛选姓名长度为3个字符的人,并返回满足此条件的元素组成的流
  Stream<String> stream2 = stream1.filter(name -> name.length() == 3);
//打印,forEach​(Consumer<? super T> action) 方法,对此流的每个元素执行操作。
  stream2.forEach(name -> System.out.println(name));

​​运行结果:
​​​
​​​​​​在这里插入图片描述

2.2)Stream流中的函数式接口Supplier

1.自定义方法 getDemo() ,传入的参数是函数式接口Supplier,使用getDemo方法时使用匿名内部类的写法,重写get()方法。

//java.util.function.Supplier<T>:生产型接口,代表结果供应商。
//(这里看着很绕,其实就是说不给参数也会给你一个结果)
//抽象方法T get​() 获得结果。public static void main(String[] args) {
        //匿名内部类,重写get()方法
        getDemo(new Supplier<String>() {
            @Override
            public String get() {
                return "hello world";
            }
        });
        // lambda
        getDemo(()->{ return "HELLO WORLD";});
    }

//自定义方法 getDemo() ,传入的参数是函数式接口Supplier
    public static void getDemo(Supplier<String> supplier){
        String s = supplier.get();
        System.out.println("s = " + s);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

破解极域电子教室控屏

以管理员身份运行cmd 输入代码

CentOS7安装Docker及禅道

https://blog.csdn.net/weixin_46453070/article/details/136183615?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171246925816800222886233%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id171246925816800222886233&biz_i…

C++ //练习 11.22 给定一个map<string, vector<int>>,对此容器的插入一个元素的insert版本,写出其参数类型和返回类型。

C Primer&#xff08;第5版&#xff09; 练习 11.22 练习 11.22 给定一个map<string, vector<int>>&#xff0c;对此容器的插入一个元素的insert版本&#xff0c;写出其参数类型和返回类型。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具…

图形化界面使用MQ!!!

一、docker安装 1、拉去镜像 docker pull rabbitmq:3.10-management 2、Docker运行&#xff0c;并设置开机自启动&#xff08;第一个-p是MQ默认配置的端口&#xff0c;第二个-p是图形化界面配置的端口&#xff09; docker run -d --restartalways --name rabbitmq -p 5672:5672…

5毛钱的DS1302 N/Z串行实时时钟IC

推荐原因&#xff1a; 便宜&#xff0c;够用 该器件最早为DALLAS的产品&#xff0c;所以冠有DS&#xff0c;现国内有多个厂家生产&#xff0c;部分价格不到5毛钱的含税价格&#xff0c;有此自行车&#xff0c;还要什么宝马&#xff1f; 下述为简介&#xff0c;使用前请参阅相应…

汇编语言第一讲:计算机的组织架构和汇编语言介绍

第一讲&#xff1a;计算机的组织架构和汇编语言介绍 汇编语言计算机组织架构 数字电路术语回顾数制 数字电路 硬件电路数字电路的问题 汇编语言的开始 程序的节(sections)调用操作系统的系统调用列出文件(Listing files)汇编和链接调试汇编程序反汇编现有的程序 附录 课程资源 …

SpringBoot项目 jar包方式打包部署

SpringBoot项目 jar包方式打包部署 传统的Web应用进行打包部署&#xff0c;通常会打成war包形式&#xff0c;然后将War包部署到Tomcat等服务器中。 在Spring Boot项目在开发完成后&#xff0c;确实既支持打包成JAR文件也支持打包成WAR文件。然而&#xff0c;官方通常推荐将Sp…

LeetCode初级算法书Java题解日常更新

LeetCode初级算法高效题解&#xff08;含思路注释&#xff09; 文章目录 LeetCode初级算法高效题解&#xff08;含思路注释&#xff09;前言一、数组1.删除排序数组中的重复项2.买卖股票的最佳时机 II3.旋转数组4.存在重复元素 总结 前言 决定用四个月过一下算法 一、数组 1.…

下载python电子书

下面展示一些 内联代码片。 import requests from lxml import etree from urllib import parse from pprint import pprint from tqdm import tqdm class PythonBook: def init(self): self.url“https://m.jb51.net/books/list476_1.html” self.url_page“https://m.jb51.n…

二维码门楼牌管理应用平台:促进二手交易市场的透明化与规范化

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台在二手交易市场中的应用四、二维码门楼牌管理应用平台的未来展望 前言 随着互联网的快速发展&#xff0c;二维码技术已广泛应用于各个领域。在二手交…

【操作系统】python实现银行家算法

银行家算法是最具有代表性的避免死锁的算法。 1、算法原理 银行家算法&#xff1a;当一个新进程进入系统时&#xff0c;该进程必须申明在运行过程中所需要的每种资源的最大数目&#xff0c;且该数目不能超过系统拥有的资源总量。当进程请求某组资源时&#xff0c;系统必须先确…

HarmonyOS 应用开发-自定义Swiper卡片预览效果实现

介绍 本方案做的是采用Swiper组件实现容器视图居中完全展示&#xff0c;两边等长露出&#xff0c;并且跟手滑动效果。 效果图预览 实现思路 本解决方案通过维护所有卡片偏移的数组&#xff0c;实时更新卡片的偏移量&#xff0c;以实现swiper子组件内图片居中展示&#xff0c…

DHT11温度检测系统

DHT11温湿度传感器 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;应用领域&#xff1a;暖通空调&#xff1b;汽车&#xff1b;消费品&#xff1b;气象站&#xff1b;湿度调节器&#xff1b;除湿器&#xff1b;家电&#xff1b;医…

好物推荐:六款让人眼前一亮的个人博客

1.前言 总是有人在问零基础如何搭建个人博客、有哪些好用的博客系统推荐、个人博客和国内技术社区怎么选择&#xff1f;诸如此类的很多问题。对于最后一个问题&#xff0c;我个人的看法很简单&#xff0c;看需求&#xff01; 目前国内做的还不错的技术类社区/论坛其实还是比较…

stack和queue的使用

前言 前面我们对string、vector、list做了介绍并对底层进行了实现&#xff01;本期我们继续来介绍STL容器&#xff0c;stack和queue&#xff01; 本期内容介绍 stack 常用接口的介绍 queue 常用接口的介绍 什么是stack? 这里的栈和我们C语言实现的数据结构的那个栈功能是一样…

RabbitMQ-死信队列常见用法

目录 一、什么是死信 二、什么是死信队列 ​编辑 三、第一种情景&#xff1a;消息被拒绝时 四、第二种场景&#xff1a;. 消费者发生异常&#xff0c;超过重试次数 。 其实spring框架调用的就是 basicNack 五、第三种场景&#xff1a; 消息的Expiration 过期时长或队列TTL…

neo4j使用详解(十一、cypher自定义函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 10.自定义函数 用户定义函数用Java编写&#xff0c;部署到数据库中&#xff0c;并以与任何其他Cypher函数相同的…

Java变量详解

​ 这里写目录标题 第一章、Java中的变量分类1.1&#xff09;变量分类1.2&#xff09;成员变量分类1.3&#xff09;成员变量和局部变量的区别 第二章、成员变量详解2.1&#xff09;成员变量作用域/权限修饰符2.2&#xff09;成员变量和成员属性的区别2.3&#xff09;成员变量初…

网络通信流程

建立完tcp请求再发起http请求 开启系统代理之后&#xff0c;以clash verge为例 127.0.0.1:7897&#xff0c;假设hci.baidu.com的IP为153.37.235.50 发起对hci.baidu.com的HTTP请求&#xff0c;由于开启了系统代理不进行DNS解析&#xff0c;浏览器调用socket()获得一个socket&a…

GlusterFS(GFS)分布式文件系统

一、GlusterFS的概述&#xff1a; GlusterFS 是一个开源的分布式文件系统。 只在扩展存储容器&#xff0c;提高性能 并且通过多个互联网络的存储节点的进行几余&#xff0c;以确保数据的可用性和一致性 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c…