Java基础_Stream流

Java基础_Stream流

  • Stream流的简单使用
  • Stream流的获取
  • Stream流的中间方法
  • Stream流的终结方法
  • 综合练习
    • 数字过滤
    • 字符串过滤并收集
    • 自定义对象过滤并收集
  • 来源
  • Gitee地址

Stream流的简单使用

public class StreamDemo01 {
    public static void main(String[] args) {
        /**
         * 创建集合添加元素,完成以下需求:
         * 1.把所有以“张”开头的元素存储到新集合中
         * 2.把“张”开头的,长度为3的元素再存储到新集合中
         * 3.遍历打印最终结果
         */

        ArrayList<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

        list.stream()
                .filter(name -> name.startsWith("张"))
                .filter(name -> name.length() == 3)
                .forEach(name -> System.out.println(name));

        // ArrayList<String> list1 = new ArrayList<>();
        // for (String name : list) {
        //     if(name.startsWith("张")){
        //         list1.add(name);
        //     }
        // }
        //
        // ArrayList<String> list2 = new ArrayList<>();
        // for (String name : list1) {
        //     if(name.length() == 3){
        //         list2.add(name);
        //     }
        // }
        //
        // for (String name : list2) {
        //     System.out.println(name);
        // }
    }
}

Stream流的获取

在这里插入图片描述

  • 单列集合
    public class StreamDemo2 {
        public static void main(String[] args) {
            /**
             * 单列集合获取Stream流
             */
    
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "a", "b", "c", "d", "e");
    
            // list.stream().forEach(new Consumer<String>() {
            //     @Override
            //     public void accept(String s) {
            //         System.out.println(s);
            //     }
            // });
    
            list.stream().forEach(s -> System.out.println(s));
        }
    }
    
  • 双列集合
    public class StreamDemo3 {
        public static void main(String[] args) {
            /**
             * 双列集合获取Stream流
             */
    
            HashMap<String, Integer> map = new HashMap<String, Integer>();
            map.put("aaa", 111);
            map.put("bbb", 222);
            map.put("ccc", 333);
            map.put("ddd", 444);
            map.keySet().stream().forEach(key -> System.out.println(key));
            map.entrySet().stream().forEach(entry -> System.out.println(entry));
        }
    }
    
  • 数组
    public class StreamDemo4 {
        public static void main(String[] args) {
            /**
             * 数组获取Stream流
             */
            int[] arr1 = {1, 2, 3, 4};
            String[] arr2 = {"a", "b", "c", "d"};
    
            Arrays.stream(arr1).forEach(num -> System.out.println(num));
            Arrays.stream(arr2).forEach(str -> System.out.println(str));
    
            /**
             * 注意:
             * Stream接口中静态方法of的细节
             * 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
             * 但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素,放到Stream中
             */
            Stream.of(arr1).forEach(num -> System.out.println(num));//[I@448139f0
            Stream.of(arr2).forEach(str -> System.out.println(str));
        }
    }
    
  • 零散数据
    public class StreamDemo5 {
        public static void main(String[] args) {
            /**
             * 零散数据获取Stream流
             */
    
            Stream.of(1, 2, 3, 4).forEach(num -> System.out.println(num));
        }
    }
    

Stream流的中间方法

在这里插入图片描述

  • 注意
    • 中间方法,返回新的Stream流,原来的Stream流只能用一次,建议使用链式编程
    • 修改Stream流中的数据,不会影响原来集合或者数组中的数据
  • filter,skip,limit
    public class StreamDemo6 {
        public static void main(String[] args) {
            /**
             * Stream流的中间方法
             * filter, skip, limit
             */
    
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
    
            // list.stream().filter(new Predicate<String>() {
            //     @Override
            //     public boolean test(String s) {
            //         return s.startsWith("张");
            //     }
            // }).forEach(s -> System.out.println(s));
    
            // filter 过滤
            System.out.println("filter");
            list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
    
            // limit 获取前几个元素
            System.out.println("limit");
            list.stream().limit(3).forEach(str -> System.out.println(str));
    
            // skip 跳过前几个元素
            System.out.println("skip");
            list.stream().skip(3).forEach(str -> System.out.println(str));
    
            // 练习:获取[2, 3]
            System.out.println("[2, 3]的元素为");
            list.stream().skip(2).limit(2).forEach(s -> System.out.println(s));
        }
    }
    
  • distinct,concat
    public class StreamDemo7 {
        public static void main(String[] args) {
            /**
             * distinct, concat
             */
    
            ArrayList<String> list1 = new ArrayList<>();
            Collections.addAll(list1, "张无忌", "张无忌", "张无忌", "周芷若", "赵敏", "张强", "张三丰");
            ArrayList<String> list2 = new ArrayList<>();
            Collections.addAll(list2, "Tommy", "Jelly", "Mike");
    
            // distinct 元素去重,依赖hashCode和equals方法(底层是HashSet)
            list1.stream().distinct().forEach(s -> System.out.println(s));
    
            // concat 合并a和b为一个流
            System.out.println("concat");
            Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));
        }
    }
    
  • map
    public class StreamDemo8 {
        public static void main(String[] args) {
            /**
             * map
             */
    
            // map 转换流中的数据类型
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "张无忌-18", "周芷若-19", "赵敏-21", "张强-23", "张三丰-27");
    
            /**
             * 第一个类型:流中原本的数据类型
             * 第二个类型:转换后的类型
             * apply的形参s:依次表视流里面的每一个数据
             * 返回值:表视转换之后的数据
             *
             * map方法执行完毕之后,流上的数据就变成了整数
             */
            // list.stream().map(new Function<String, Integer>() {
            //     @Override
            //     public Integer apply(String s) {
            //         String[] split = s.split("-");
            //         int age = Integer.parseInt(split[1]);
            //         return age;
            //     }
            // }).forEach(num -> System.out.println(num));
    
            list.stream().map(s -> {
                String[] split = s.split("-");
                int age = Integer.parseInt(split[1]);
                return age;
            }).forEach(num -> System.out.println(num));
        }
    }
    

Stream流的终结方法

在这里插入图片描述

  • forEach, count, toArray
    public class StreamDemo9 {
        public static void main(String[] args) {
            /**
             * forEach, count, toArray
             */
    
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
    
            System.out.println("forEach");
            // void forEach(Consumer action) 遍历
            // Consumer的泛型:表示流中数据的类型
            // accept方法的形参s:依次表视流里面的每一个数据
            // 方法体:对每一个数据的处理操作
            // list.stream().forEach(new Consumer<String>() {
            //     @Override
            //     public void accept(String s) {
            //         System.out.println(s);
            //     }
            // });
            list.stream().forEach(s -> System.out.println(s));
    
            System.out.println("count");
            // long count 统计
            System.out.println(list.stream().count());
    
            System.out.println("toArray");
            // toArray 收集流中的数据,放到数组中
            /* 1
            Object[] objects = list.stream().toArray();
            System.out.println(Arrays.toString(objects));
            */
            /* 2
            String[] arr1 = list.stream().toArray(new IntFunction<String[]>() {
                @Override
                public String[] apply(int value) {
                    return new String[value];
                }
            });
            System.out.println(Arrays.toString(arr1));
            */
            String[] arr2 = list.stream().toArray(value -> new String[value]);
            System.out.println(Arrays.toString(arr2));
        }
    }
    
  • collect
    public class StreamDemo10 {
        public static void main(String[] args) {
            /**
             * collect
             */
    
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "张无忌-男-13", "张无忌-男-13", "周芷若-女-17", "赵敏-女-21", "张强-男-23", "张三丰-男-27", "张翠流-女-31", "张良-男-34", "王二麻子-男-37", "谢广坤-男-41");
    
            // collect(Collector collector) 收集流中的数据,放到集合中(List Set Map)
    
            // 收集男性
            System.out.println("toList");
            List<String> list1 = list.stream()
                    .filter(s -> "男".equals(s.split("-")[1]))
                    .collect(Collectors.toList());
            System.out.println(list1);
    
            System.out.println("toSet");
            Set<String> set = list.stream()
                    .filter(s -> "男".equals(s.split("-")[1]))
                    .collect(Collectors.toSet());
            System.out.println(set);
    
            System.out.println("toMap");
            // Map<String, Integer> map = set.stream()
            //         .filter(s -> "男".equals(s.split("-")[1]))
            //         .collect(Collectors.toMap(
            //                 new Function<String, String>() {
            //                     @Override
            //                     public String apply(String s) {
            //                         return s.split("-")[0];
            //                     }
            //                 },
            //                 new Function<String, Integer>() {
            //                     @Override
            //                     public Integer apply(String s) {
            //                         return Integer.parseInt(s.split("-")[2]);
            //                     }
            //                 }
            //         ));
            Map<String, Integer> map = set.stream()
                    .collect(Collectors.toMap(
                            s -> s.split("-")[0],
                            s -> Integer.parseInt(s.split("-")[2])
                    ));
            System.out.println(map);
        }
    }
    

综合练习

数字过滤

public class StreamDemo11 {
    public static void main(String[] args) {
        /**
         * 定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10
         * 过滤奇数,只留下偶数。
         * 并将结果保存起来
         */

        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> res = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
        System.out.println(res);
    }
}

字符串过滤并收集

public class StreamDemo12 {
    public static void main(String[] args) {
        /**
         * 创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄
         * “zhangsan,23"
         * “lisi,24”
         * "wangwu,25”
         * 保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
         */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "zhangsan,23", "lisi,24", "wangwu,25");

        Map<String, Integer> map = list.stream()
                .filter(s -> Integer.parseInt(s.split(",")[1]) >= 24)
                .collect(Collectors.toMap(
                        s -> s.split(",")[0],
                        s -> Integer.parseInt(s.split(",")[1])
                ));
        System.out.println(map);
    }
}

自定义对象过滤并收集

public class StreamDemo13 {
    public static void main(String[] args) {
        /**
         * 现在有两个ArrayList集合
         * 第一个集合中:存储6名男演员的名字和年龄。
         * 第二个集合中:存储6名女演员的名字和年龄
         * 姓名和年龄中间用逗号隔开。比如:张三,23
         * 要求完成如下的操作:
         * 1,男演员只要名字为3个字的前两人
         * 2,女演员只要姓杨的,并且不要第一个
         * 3,把过滤后的男演员姓名和女演员姓名合并到一起
         * 4,将上一步的演员信息封装成Actor对象:
         * 5,将所有的演员对象都保存到List集合中。
         * 备注:演员类Actor,属性有:name,age
         * "蔡坤坤,24","叶齁咸,23","刘不甜,22","吴签,24","谷嘉,30","肖梁梁,27"
         * "赵小颖,35”,"杨颖,36","高元元,43","张天天,31","刘诗,35","杨小幂,33"
         */
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "赵小颖,35", "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");

        Stream<String> stream1 = list1.stream()
                .filter(s -> s.split(",")[0].length() == 3)
                .limit(2);
        Stream<String> stream2 = list2.stream()
                .filter(s -> s.split(",")[0].startsWith("杨"))
                .skip(1);
        Stream<String> stream3 = Stream.concat(stream1, stream2);
        List<Actor> list = stream3.map(s -> {
            String[] arr = s.split(",");
            String name = arr[0];
            int age = Integer.parseInt(arr[1]);
            return new Actor(name, age);
        }).collect(Collectors.toList());
        System.out.println(list);
    }
}

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

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

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

相关文章

【C++ | 拷贝赋值运算符函数】一文了解C++的 拷贝赋值运算符函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-09 1…

API接口测试工具:jmeter的安装、汉化、Jmeter桌面快捷图标和基本使用

文章目录 测试工具&#xff1a;JmeterJmeter安装和配置Jmeter汉化设置中文语言&#xff1a;永久方式设置中文语言&#xff1a;临时方式 设置Jmeter桌面快捷图标jmeter基本用法Jmeter无法保存测试问题解决 测试工具&#xff1a;Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保…

kafka集成flink api编写教程

1.引入依赖&#xff08;pox.xml&#xff09; <dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.13.6</version></dependency><dependency><gro…

C# WPF入门学习主线篇(十六)—— Grid布局容器

C# WPF入门学习主线篇&#xff08;十六&#xff09;—— Grid布局容器 欢迎来到C# WPF入门学习系列的第十六篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel 和 DockPanel 布局容器及其使用方法。本篇博客将介绍另一种功能强大且灵活的布局容器—…

MT76X8 RF定频使用方法

一、从下面网址下载QA软件包&#xff0c;然后在WIN系统下安装QA环境。https://download.csdn.net/download/zhouwu_linux/89408573?spm1001.2014.3001.5503 在WINDOWS 7系统下先安装WinPcap_4_1_3.exe。 二、硬件连接。 模块上电&#xff0c;PC机 的IP配置成为10.10.18.100&a…

GraphQL(6):认证与中间件

下面用简单来讲述GraphQL的认证示例 1 实现代码 在代码中添加过滤器&#xff1a; 完整代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grapqlHTTP require(express-graphql).graphqlHTTP; // 定义schema&#xff0c;…

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…

微服务第一轮

课程文档 目录 一、业务流程 1、登录 Controller中的接口&#xff1a; Service中的实现impl&#xff1a; Service中的实现impl所继承的接口IService&#xff08;各种方法&#xff09;&#xff1a; VO&#xff1a; DTO&#xff1a; 2、搜索商品 ​Controller中的接口&a…

牛客热题:最长公共子串

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长公共子串题目链接方法一&am…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法&#xff1a;SET key value [EX seconds | PX milliseconds] [NX|XX] 说明&#xff1a;将string类型的value值设置到指定key中&#xff0c;如果之前该key存在&#xff0c;则会覆盖原先的值&#xff0c;原先…

Java--可变参数

1.JDK1.5开始&#xff0c;Java支持同类型的可变参数给一个方法 2.在方法声明之前&#xff0c;在指定参数类型后加一个省略号&#xff08;...&#xff09; 3.一个方法只能指定一个可变参数&#xff0c;它必须是方法的最后一个参数&#xff0c;任何普通的参数必须在它之前声明 …

Java----抽象类和接口

欢迎大家来这次博客-----抽象类和接口。 1.抽象类 1.1 抽象类概念 在Java中我们都是通过类来描述对象&#xff0c;但反过来并不是所有的类都是用来描述对象的。当一个类中没有足够的信息来描述一个具体对象&#xff0c;我们就将该类称为抽象类。 如上图中的Shape类&#xff…

支付宝订单支付和超时收单

下订单成功后&#xff0c;发送mq消息到死信队列&#xff0c;消息过期后根据死信的路由key重新路由到交换机&#xff0c;交换机根据消息的路由key把消息路由到普通队列上&#xff0c;消费者监听队列并消费。 问题&#xff0c;现在提交订单信息调用支付宝的支付页面&#xff0c;…

AI论文速读 | 2024[ICML]FlashST:简单通用的流量预测提示微调框架

题目&#xff1a; FlashST: A Simple and Universal Prompt-Tuning Framework for Traffic Prediction 作者&#xff1a;Zhonghang Li, Lianghao Xia&#xff08;夏良昊&#xff09;, Yong Xu&#xff08;徐勇&#xff09;, Chao Huang 机构&#xff1a;华南理工大学&#xf…

分享不用会员免费听歌的软件,可听付费,支持随听随下!

今天来点特别的&#xff0c;给你们带来几款全网免费听歌的神器&#xff0c;让你们的音乐之旅不再有障碍&#xff01; 现在&#xff0c;找好听的歌越来越像寻宝一样&#xff0c;动不动就得掏腰包。不过别担心&#xff0c;阿星今天就来分享几款好用的免费听歌app&#xff0c;电脑…

SQL(一)基本语法

文章目录 一、Sql 语言基本特点二、数据查询&#xff08;按执行顺序排列&#xff09;1. From & Join2. Where3. Group by4. Having5. Select6. Distinct7. Order by8. Limit/ Offset 三、功能公式1. 字符处理2. 时间处理3. 统计计算 一、Sql 语言基本特点 不区分大小写分号…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值&#xff08;数字&#xff…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

ChatGPT Prompt技术全攻略-精通篇:Prompt工程技术的高级应用

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

计算机网络到底是指什么?

计算机网络是信息技术领域中最为核心和复杂的一部分&#xff0c;它涵盖了众多的技术原理和应用。下面&#xff0c;我们将从技术层面深入探讨计算机网络的相关内容。 一、计算机网络的分层模型 计算机网络的分层模型是网络通信的基石&#xff0c;它将网络通信过程划分为不同的层…