Stream流(入门篇)

2023-11-04

目录

前言:

1、Stream流概述

2、获取Stream流的方式

2.1 单列集合获取Stream流

 2.2 双列集合获取Stream流

2.3 数组获取Stream流

2.4 零散数据获取Stream流

3、Stream流的中间方法 

4、Stream 流的终结方法

5、Stream练习题


前言:

        在学习Stream流之前,你需要先学习 匿名内部类和lambda表达式

匿名内部类:是继承了该类(子类)或者 实现了该接口的(实现类)匿名对象。

lambda表达式:是对匿名内部类的简写。

1、Stream流概述

        Stream 流 jdk1.8引入的新特性;

        Stream API 可以极大提高 Java 程序员的生产力,让程序员写出更高效率、干净、简洁的代码;

        这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行更改处理,比如筛选,排序,聚合等。

2、获取Stream流的方式

Stream流获取方式
获取方式 方法名 说明
单列集合 default Stream<E>stream() Collection中的默认方法
双列集合 无法直接使用stream流,需要使用KeySet(),entrySet()
数组 public static<T>Stream<T>stream(T[]array) Array工具类中的静态方法
一堆零散数据 public static<T>Stream<T>of(T... values) Stream接口中的静态方法

2.1 单列集合获取Stream流

 public static void main(String[] args) {
        // 单列集合
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张三", "李四", "王五", "赵六");

        // 匿名内部类
        //void forEach(Consumer action)  遍历
        //Consumer的泛型:表示流中的数据类型
        //accept方法的形参s:依次表示流里的每一个数据
        //方法体:对每一个数据的处理操作(打印)
        list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        
        System.out.println("===========================");
        
        /**
         * lambda 表达式
         *  s 为 集合中的每一个元素
         *  ->为 lambda表达式 标识符
         */
        list.stream().forEach(s -> System.out.println(s));
    }

 2.2 双列集合获取Stream流

 public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("赵芸", 22);
        map.put("张非", 24);
        map.put("刘蓓", 27);
        map.put("关雨", 18);

        // KeySet() 键
        map.keySet().stream().forEach(result -> System.out.println(result));

        //entrySet() 键值对
        map.entrySet().stream().forEach(result -> System.out.println(result));
    }

2.3 数组获取Stream流

 public static void main(String[] args) {
        //基本数据类型
        int arr1[] = {1, 3, 4, 5, 6};
        Arrays.stream(arr1).forEach(result -> System.out.println(result));

        //引用数据类型
        String arr2[] = {"a", "b", "c", "d"};
        Arrays.stream(arr2).forEach(result -> System.out.println(result));
    }

2.4 零散数据获取Stream流

 public static void main(String[] args) {
        //零散数据
        Stream.of(1, 2, 4, "a").forEach(result -> System.out.println(result));
    }
/**
* Stream接口中静态方法 of 的细节
* 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
* 但是数组必须是引用数据类型,如果传递基本数据类型,是会把整个数组
* 当作成一个元素,放到Stream当中
*/

3、Stream流的中间方法 

名称 说明
Stream<T> filter (Predcate<? super T>predicate) 过滤
Stream<T> limit (long maxSize) 获取前几个元素
Stream<T> skip  跳过前几个元素
Stream<T> distinct() 元素去重,依赖(hashCode和equals方法)
Static<T>Stream<T>concat(Stream a,Stream b) 合并两个流为一个流
Stream<R> map(Function<T,R>mapper) 转换流中的数据类型

    方法实现:

 public static void main(String[] args) {
        // 单列集合
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张三", "李四", "王五", "赵六");

        //1、过滤
        // startWith 检测某字段是否以指定的前缀开始的
        System.out.println("===============filter过滤====================");
        list.stream()
                .filter(s -> s.startsWith("张"))
                .forEach(result -> System.out.println(result));
        //2、skip 跳过
        System.out.println("===============skip跳过====================");
        list.stream().skip(2).forEach(result -> System.out.println(result));
 
       //3、limit 获取前几个元素
        System.out.println("===============limit获取前几个元素====================");       
        list.stream().limit(2).forEach(result -> System.out.println(result));
 
        //4、concat 合并流
        System.out.println("===============concat合并流====================");        
        Stream<String> oneStream = Stream.of("a", "b", "c");
        Stream<Integer> twoStream = Stream.of(1, 2, 3);
        Stream.concat(oneStream, twoStream).forEach(result -> System.out.print(result));

        //5、map转换流中的数据类型
        System.out.println("===============map转换流中的数据类型====================");
        List<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "1", "2", "3", "4");
        list2.stream()
                .map(s -> Integer.parseInt(s)).filter(s -> s > 2)
                .forEach(result -> System.out.println(result));
    }

4、Stream 流的终结方法

名称 说明
void forEach(Consumer action) 遍历
long count() 统计
toArray 收集流中的数据,放到数组中
collect(Collector collector) 收集流中的数据,放到集合中
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张三-12", "李四-13", "王五-20");

        System.out.println("========终结方法:forEach遍历=========");
        /**
         * 匿名内部类语法
         *  Consumer 的泛型:表示流中的数据类型
         *  accept 方法的形参s:依次表示流里的每一个数据
         *  方法体:对每一个数据的处理操作(打印)
         */
        list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        //统计
        System.out.println("======终结方法:count======");
        long count = list.stream().count();
        System.out.println(count);


        /**
         * 匿名内部类语法
         * toArray 收集流中的数据,放到数组中
         * toArray 方法参数的作用:会依次得到流里面的每一个数据,并把数据放到数组当中
         * toArray 方法的返回值:是一个装着流里面所有数据的数组
         * 
         * InterFunction的泛型:具体类型的数组
         * apply 的形参:流中数据的个数,要跟数组的长度保持一致
         * apply 的返回值具体类型的数组
         */
        System.out.println("=====终结方法:toArray========");
        list.stream().toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });

    }

5、Stream练习题

(1)收集流中所有男性的数组

//收集流中,男性的数据
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        Collections.addAll(list1, "张飞-男-45", "刘备-男-50", "关羽-男-47", "孙尚香-女-34", "貂蝉-女-28");
        // split:分割
        list1.stream().filter(s -> "男".equals(s.split("-")[1]))
                .forEach(s -> System.out.println(s));

        // collect 收集
        System.out.println("=== 将List集合中的男性收集到set集合中 ===");
        List<String> list2 = new ArrayList<>();
        Collections.addAll(
                list2,
                "张飞-男-45", "张飞-男-45", "刘备-男-50", "关羽-男-47", "孙尚香-女-34", "貂蝉-女-28");
        list2.stream().filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toSet()).forEach(s -> System.out.println(s));
        /** 回顾集合知识
         *  list 收集数据有序、可重复
         *  set 收集数据无序、不可重复
         */

        // collect
        System.out.println("将ArrayList集合中的男性收集到Map集合中");
        Map<String, String> map = list1.stream().filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(
                        s -> s.split("-")[0]
                        ,
                        s -> s.split("-")[2]
                ));
        map.entrySet().forEach(result -> System.out.println(result));
    }

(2)List集合转map集合所遇到的问题

所分割后的数据,key重复,会报出异常

 解决方法:

 public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张飞-男-45", "张飞-男-48", "刘备-男-50", "关羽-男-47", "孙尚香-女-34", "貂蝉-女-28");
        Map<String, String> map = list.stream().collect(Collectors.toMap(
                s -> s.split("-")[0]
                ,
                s -> s.split("-")[2]
                // 如果转换map集合的key重复,则后面的value替换掉前面的value
                // 也可替换顺序(s1,s2)-> s1,前面的key不变
                , (s1, s2) -> s2
        ));
        map.entrySet().forEach(result -> System.out.println(result));
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stream流(入门篇) 的相关文章

随机推荐

  • 物理渗透-Mifare Classic S50(IC)卡分析

    前言 我们不管是在小区里还是公司里 都可能会使用过门禁卡 比如乘坐电梯需要刷工牌才使用 而且只能去特定的楼层 生活中还有很多地方用到过IC卡 商铺的会员卡 交通的公交卡等等 关于IC ID卡的基础 本节不做详细叙述 只介绍M1的IC卡如何去
  • 【C++ Primer】重载运算与类型转换

    文章目录 一 基本概念 二 输入输出运算符 1 重载输出运算符 lt lt 2 重载输入运算符 gt gt 三 算数和关系运算符 1 相等运算符 2 关系运算符 四 赋值运算符 五 下标运算符 六 递增递减运算符 七 成员访问运算符 八 函
  • windows下网络编程UDP

    转载 C UDP客户端服务器Socket编程 UDPServer cpp include
  • IC项目中svn使用经验总结

    一 svn权限 二 svn分支 三 项目中遇到的问题总结 svn内容太大怎么解 svn的trunk经常不稳定怎么解 svn merge 冲突的处理方式 四 疑问 svn使用者未及时提交代码至trunk分支怎么办 提交代码至trunk后在tr
  • 每日一题:从前序与中序遍历序列(C++)

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出 前序遍历 preorder 3 9 20 15 7 中序遍历 inorder 9 3 15 20 7 返回如下的二叉树 3 9 20 15
  • html、vue、uni-app微信小程序的区别

    传统的h5只有1端 即浏览器 而uni app可跨多端 虽仍属前端 与传统h5有不同 网络模型的变化 以前网页大多是b s 服务端代码混合在页面里 现在是c s 前后端分离 通过js api 类似ajax的uni request 获取jso
  • opencv读取rtsp的一些优化

    用队列将同步转为异步 import cv2 import queue import time import threading q queue Queue def Receive print start Reveive cap cv2 Vi
  • 迅雷链同构多链框架解析

    本文转载自迅雷官方微信群 传统意义上的 甚至是消费者端熟知的迅雷 是那家唯一在美国上市的中国下载服务商 主营业务还是在线广告 游戏和会员 迅雷从2015年开始对分布式计算和区块链领域的布局 这几年 迅雷布局了CDN 推出了C端的赚钱宝和玩客
  • Notepad++ 支持markdown语法

    之前windows下想编写markdown只是通过有道云笔记来写 看的时候简单的就直接用notepad 看 有些语法得导入到有道云笔记中看很不方便 搜索windows下的markdown编辑工具 Typora sublime markdow
  • myBase7安全破解的方法

    转自https blog csdn net weixin 42414714 article details 89642305 首先 保证myBase7是关闭状态 然后执行以下步骤 1 找到myBase7的安装目录 右击mybase的启动图标
  • 用Python预测收入,来看看你的收入到底应该是多少?

    Python界的网红机器学习 这股浪潮已经逐渐成为热点 而Python是机器学习方向的头牌语言 用机器学习来玩一些好玩的项目一定很有意思 比如根据你的职业 婚姻 家庭 教育时间等等来预测你的收入 这么神奇 不信的话 一起跟我往下看 1 数据
  • 如何使用chatGPT进行论文润色(中英文均可)

    1 为什么ChatGPT可以进行论文润色 ChatGPT本质是一个基于GPT3 5 应用在对话场景的超大语言模型 在各种数据集上经过训练而来的 很好的掌握了语言的 本质 特征 自然可以进行语言相关的工作 论文润色只是小事情 2 如何使用ch
  • 搭建简单的神经网络——使用pytorch实现鸢尾花的分类

    最近写毕业论文 看到网上的pytorch入门nn方法乱七八糟 遂写了本篇方法 好让更多的人可以使用pytorch实现简单的神经网络方法 version python 3 7 9 pytorch 1 7 0 function 利用神经网络进行
  • 区块链中的:哈希算法

    什么是哈希算法 哈希算法 又称散列算法 它是一个单向函数 可以把任意长度的输入数据转化为固定长度的输出 h H x h H x h H x 例如 对 morning 和 bitcoin 两个输入进行某种哈希运算 得到的结果是固定长度的数字
  • 当根据条件查询数据库中记录没有,但是又想返回0怎么办?

    我们平时在操作数据库的时候 对于null的记录或者字段相信大家都可以用ifnull 来判断为null的时候需求返回什么数据 但是如果根据条件查询的时候 数据库根本没有这条记录但是又想返回数据不存在时候的结果该怎么办 比如你统计一个时间区间的
  • 关于g2o的使用笔记

    文章目录 前言 一 g2o进行非线性优化 二 g2o进行前端位姿优化 三 g2o进行后端位姿优化 总结 前言 g2o是比较流行的图优化库 在视觉slam中的应用非常广泛 关于如何利用g2o求解BA优化问题 在此作个笔记 以供后面的学习中方便
  • webRTC的标准与发展

    Web实时通信 WebRTC 是标准 协议和JavaScript API的集合 两者的组合可实现浏览器 对等 之间的对等音频 视频和数据共享 WebRTC无需依赖第三方插件或专有软件 而是将实时通信转变为任何Web应用程序都可以通过简单的J
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 一觉睡醒,ChatGPT 竟然被淘汰了?

    点击上方 码农突围 马上关注 这里是码农充电第一站 回复 666 获取一份专属大礼包 真爱 请设置 星标 或点个 在看 来源丨转自公众号 机器之心 编辑 杜伟 陈萍 OpenAI 的 Andrej Karpathy 都大力宣传 认为 Aut
  • Stream流(入门篇)

    目录 前言 1 Stream流概述 2 获取Stream流的方式 2 1 单列集合获取Stream流 2 2 双列集合获取Stream流 2 3 数组获取Stream流 2 4 零散数据获取Stream流 3 Stream流的中间方法 4