Stream流编程

2023-09-14 17:31:44

目录

获取流

Stream流的常用方法:

 count

.filter方法:

forEach方法

limit方法

map方法

skip方法

concat方法

收集Stream流 


 

流格式

Stream<T> filter(Predicate<? super T> predicate);
            -----> 参数:public interface Predicate<T>  (函数式接口)
                    ----> 抽象方法:boolean test(T t);
            -----> 参数:public interface Consumer<T>  (函数式接口)
                    ----> 抽象方法:boolean test(T t);
获取流

根据集合来获取:

根据Collection获取流:

Collection接口中有一个stream()方法,可以获取流

        default Stream<E> stream()
Stream<String> stream1 = list.stream();
        // 创建Map集合
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"张老三");
        map.put(2,"张小三");
        map.put(3,"李四");
        map.put(4,"赵五");
        map.put(5,"张六");
        map.put(6,"王八");

        // 3.1根据Map集合的键获取流
        Set<Integer> map1 = map.keySet();
        Stream<Integer> stream3 = map1.stream();
        // 3.2根据Map集合的值获取流
        Collection<String> map2 = map.values();
        Stream<String> stream4 = map2.stream();
        // 3.3根据Map集合的键值对对象获取瑞
        Set<Map.Entry<Integer, String>> map3 = map.entrySet();
        Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
        // 根据数组获取流
        String[] arr = {"张颜宇","张三","李四","赵五","刘六","王七"};
        Stream<String> stream6 = Stream.of(arr);

Stream流的常用方法:

终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法

非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat

 count
        List<String> list = new ArrayList<>();
        list.add("张老三");
        list.add("张小三");
        list.add("李四");
        list.add("赵五");
        list.add("张六");
        list.add("王八");

        long count = list.stream().count();
        System.out.println("集合中的元素个数是:" + count);

        输出结果:
            集合中的元素个数是:6

.filter方法:

Stream<T> filter(Predicate<? super ?> predicate); 过滤出满足条件的元素

参数Predicate:函数式接口,抽象方法:boolean test (T t)

Predicate接口:是一个判断接口

        // 获取stream流
        Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
        // 需求:过去出姓张的元素
        stream.filter((String name)->{
            return name.startsWith("张");
        }).forEach((String name)->{
            System.out.println("流中的元素" + name);
        });
forEach方法

void forEach(Consumer<? super T> action):逐一处理流中的元素 参数 Consumer<? super T> action:函数式接口,只有一个抽象方法:void accept(T t);

注意:

1.此方法并不保证元素的逐一消费动作在流中是有序进行的(元素可能丢失)

2.Consumer是一个消费接口(可以获取流中的元素进行遍历操作,输出出去),可以使用Lambda表达式

        List<String> list = new ArrayList<>();
        list.add("张老三");
        list.add("张小三");
        list.add("李四");
        list.add("赵五");
        list.add("张六");
        list.add("王八");

        // 函数模型:获取流 --> 注意消费流中的元素
        list.stream().forEach((String name)->{
            System.out.println(name);
        });

        输出结果:
            张老三
            张小三
            李四
            赵五
            张六
            王八
limit方法

Stream<T> limit(long maxSize); 取用前几个元素

注意:

参数是一个long 类型,如果流的长度大于参数,则进行截取;否则不进行操作

        // 获取流的长度
        Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
        // 需求:保留前三个元素
        stream1.limit(3).forEach((String name)->{
            System.out.println("流中的前三个元素是:" + name);
        });

        输出结果:
            流中的前三个元素是:张老三
            流中的前三个元素是:张小三
            流中的前三个元素是:李四

map方法

<r> Stream <R> map(Function<? super T,? exception R> mapper; 参数Function<T,R>:函数式接口,抽象方法:R apply(T t); Function<T,R>:其实就是一个类型转换接口(T和R的类型可以一致,也可以不一致)

        // 获取Stream流
        Stream<String> stream1 = Stream.of("11","22","33","44","55");
        // 需求:把stream1流中的元素转换为int类型
        stream1.map((String s)->{
           return Integer.parseInt(s); // 将String类型的s进行转换为Integer类型的元素,并返回
        }).forEach((Integer i)->{
            System.out.println(i);  // 将转换后的int类型的元素逐一输出
        });

        输出结果:
            11
            22
            33
            44
            55
skip方法

Stream<T> skip(long n); 跳过前几个元素 注意: 如果流的当前长度大于n,则跳过前n个,否则将会得到一个长度为0的空流

        // 获取stream流
        Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");

        stream.skip(3).forEach((String name)->{
            System.out.println("跳过前三个,打印剩下的" + name);
        });

        输出结果:
            跳过前三个,打印剩下的赵五
            跳过前三个,打印剩下的刘六
            跳过前三个,打印剩下的王七
concat方法

public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) –> 合并两个流

         Stream<String> stream1 = Stream.of("11","22","33","44","55");
        Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");

        // 需求:合并两个流
        Stream<String> stream = Stream.concat(stream1,stream2);
        stream.forEach((String name)->{
            System.out.print(name);
        });

        输出结果:
            1122334455张颜宇张三李四赵五刘六王七
收集Stream流 

Stream流中提供了一个方法,可以把流中的数据收集到单例集合中

<R, A> R collect(Collector<? super T, A, R> collector);

把流中的数据手机到单列集合中 返回值类型是R。R指定为什么类型,就是手机到什么类型的集合 参数Collector<? super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中 参数Collector如何得到 ?,

可以使用 java.util.stream.Collectors工具类中的静态方法:

– public static <T> Collector<T, ?, List<T>> toList():

转换为List集合 – public static <T> Collector<T, ?, Set<T>> toSet() :转换为Set集合

        List<String> list2 = new ArrayList<>();
        list2.add("张老三");
        list2.add("张小三");
        list2.add("李四");
        list2.add("赵五");
        list2.add("张六");
        list2.add("王八");

        // 需求:过滤出姓张的并且长度为3的元素
        Stream<String> stream = list2.stream().filter((String name) -> {
            return name.startsWith("张");
        }).filter((String name) -> {
            return name.length() == 3;
        });

        // stream 收集到单列集合中
        List<String> list = stream.collect(Collectors.toList());
        System.out.println(list);

        // stream 手机到单列集合中
        Set<String> set = stream.collect(Collectors.toSet());
        System.out.println(set);

更多推荐

【跟小嘉学 Rust 编程】二十八、Rust中的日期与时间(DateTime)

系列文章目录【跟小嘉学Rust编程】一、Rust编程基础【跟小嘉学Rust编程】二、Rust包管理工具使用【跟小嘉学Rust编程】三、Rust的基本程序概念【跟小嘉学Rust编程】四、理解Rust的所有权概念【跟小嘉学Rust编程】五、使用结构体关联结构化数据【跟小嘉学Rust编程】六、枚举和模式匹配【跟小嘉学Rust

【Vue入门】MVVM数据双向绑定与Vue的生命周期

目录一、Vue介绍1.1什么是Vue?1.2Vue的优点1.3库与框架的区别二、Vue入门2.1MVVM(数据双向绑定)2.2BootCDN(加速服务)三、Vue实例3.1Vue开发示例3.2双向数据绑定3.3Vue生命周期钩子一、Vue介绍1.1什么是Vue?Vue是一个渐进式的JavaScript框架,用于构建用户

Vue系列(一)之 Vue入门

一.Vue简介1.1概述Vue是一个构建用户界面(UI)的[渐进式]JavaScript框架。2.2特点1.声明式编码,遵循MVVM原则2.编码简单,体积小3.组件化,复用率高,代码维护容易2.3MVVM介绍MVVM,一种更好的UI模式解决方案,这个模式的核心是ViewModel,它是一种特殊的model类型,用于表示

MySQL学习系列(2)-每天学习10个知识

目录1.INNERJOIN和ON子句2.死锁3.SELECT*和SELECTcolumn1,column24.数据库的视图5.MySQL的触发器类型6.MySQL表的备份和恢复7.MySQL存储引擎8.索引优化9.MySQL中的子查询10.使用连接(JOIN)从多个表中检索数据👍点赞,你的认可是我创作的动力!⭐️收藏

VuePress网站如何使用axios请求第三方接口

前言VuePress是一个纯静态网站生成器,也就是它是无后端,纯前端的,那想要在VuePress中,发送ajax请求,请求一些第三方接口,有时想要达到自己一些目的在VuePress中,使用axios请求第三方接口,需要先安装axios,然后引入,最后使用本文包括VuePress中安装和使用axios,直接使用与挂载在根

19 Python的math模块

概述在上一节,我们介绍了Python的sys模块,包括:sys模块中一些常用的属性和函数。在这一节,我们将介绍Python的math模块。math模块提供了许多数学函数和常量,可以用于进行各种数学运算和常数表示。math模块中的常量和函数主要分为以下几类:常量:包括math.pi、math.e等,用于表示圆周率π和自然

php函数usort使用方法

在PHP中,usort()函数用于对数组进行排序,它允许你使用自定义的比较函数来确定元素的顺序。以下是usort()函数的使用方法:usort(array&$array,callable$cmp_function):bool参数说明:$array:要排序的数组,是传入函数的引用。$cmp_function:自定义的比较

BiLSTM(双向LSTM)实现股票时间序列预测(TensorFlow2版)

本专栏旨在通过实战案例帮助深度学习初学者通过实战案例快速掌握深度学习的核心概念和技术,这个专栏将覆盖以下关键主题:深度学习基础:介绍深度学习的基本原理以及数学概念,你将了解到神经网络的工作原理、激活函数、优化算法等基本概念。常见算法:例如卷积神经网络(CNN)、循环神经网络(RNN)和生成对抗网络(GAN)。数据预处理

SQL server中字段自增:IDENTITY、序列Sequence

SQLserver中字段自增:IDENTITY、序列Sequence1.列字段自增`IDENTITY在SQLServer中,IDENTITY(1,1)是用于定义一个自增长列的属性。它的含义如下:IDENTITY:表示该列是一个自增长列。(1,1):表示自增长列的起始值为1,每次递增1。当你在创建表时使用IDENTITY

Sqlserver 监控使用磁盘空间情况

最近遇到一个小问题:为了保存以往的一些数据,间了大量临时表,导致SQLserver数据增长过快,不得不想个办法监控磁盘空间使用情况。网上一般有几种办法:一是使用dm_os_volume_stats函数,缺点是无法获取非数据库所在的磁盘空间使用情况。二是使用Execmaster.dbo.xp_fixeddrives,缺点

算法基础:图

图论图论〔GraphTheory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。如下就是一种逻辑上的图结构:图是一种最复杂的数据结构,前面讲的数据结构都可以看成是图的特

热文推荐