当前位置: 首页 > news >正文

JavaSE 一些技巧 03——Stream流常用API

1 引言

Stream流是可以用于解决已有集合/数组类库有的弊端,Stream的作用是把集合转换成一个传送带,借用Stream流的强大功能进行的操作,而这个强大的功能的经典API将在此文中展示,最终流形式操作完毕以后还是要收集成集合,类比于工厂流水线,进行一道工序后可以接着进行下一道工序,直至形成一个个产品。

2 如何获取Stream流?

2.1 Collection集合如何获取Stream流

  1. 内容:调用stream()即可,List也可用这个方式
  2. 代码
        Collection<String> c = new ArrayList<>();
        Stream<String> ss = c.stream();

2.2 Map获取Stream流

  1. 内容:调用.stream()
  2. 代码
        Map<String,Integer> map = new HashMap<>();
        //先获取键的Stream流
        Stream<String> keys = map.keySet().stream();
        //获取值的Stream流
        Stream<Integer> values =map.values().stream();
        //获取键值对的流
        Stream<Map.Entry<String, Integer>> keyAndValues = map.entrySet().stream();

2.3 数组获取流

  1. 内容:两种方式
  • Arrays.stream(arr)
  • Stream.of(arr)
  1. 代码
        String[] arrs = new String[]{"Java","JavaEE","Spring Boot"};
        Stream<String> arrstream = Arrays.stream(arrs);
        Stream<String> arrstream2 = Stream.of(arrs);

3 如何使用Stream流?

3.1 filter

  1. 内容:进行条件的筛选
  2. 代码
        List<String> lists = new ArrayList<>();
        lists.add("赵敏");
        lists.add("小昭");
        lists.add("殷素素");
        lists.add("周芷若");
        lists.add("张无忌");
        lists.add("张三丰");
         //1.filter
        //中间的lambda表达式原来是个匿名内部类,Predicate是一个函数接口
        lists.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length()==3;
            }
        });

        //简化一下
        lists.stream().filter((String s) ->{
                return s.length()==3;
        });

        //继续简化:简化return,大括号,分号,参数类型,参数小括号,以后用直接背,括号中,s打个箭头,然后跟上条件,香
        lists.stream().filter(s -> s.length()==3);

        //可以多重处理,再来个filter
        lists.stream().filter(s->s.length()==3).filter(s->s.startsWith("张"))
                .forEach(System.out::println);//遍历下,然后方法引用

3.2 count

  1. 内容:计数
  2. 代码
        long count = lists.stream().filter(s->s.length()==3).filter(s->s.startsWith("张"))
                .count();
        System.out.println(count);

3.3 limit

  1. 内容:取前几个
  2. 代码
        //limit取前几个,找长度为3的前两个
        lists.stream().filter(s->s.length()==3 ).limit(2)
                .forEach(System.out::println);

3.4 skip

  1. 内容:跳过几个
  2. 代码
        //4.跳过前两个
        lists.stream().filter(s->s.length()==3 ).skip(2)
                .forEach(System.out::println);

3.5 map

  1. 内容:(映射),把原来的元素加工后,重新放上去
  2. 代码
  //需求:把名字都加上“倚天屠龙记的:+xxx”
        lists.stream().map(s->"倚天屠龙记的"+s)
                .forEach(System.out::println);

        //需求:把名字都加工成学生对象放上去!
        lists.stream().map(s-> new Student(s))
                .forEach(System.out::println);
        //构造器引用可以再装一下
        lists.stream().map(Student::new)
                .forEach(System.out::println);

3.6 合并流

  1. 内容:把流两两合并
  2. 代码
        //数组流
       Stream<Integer> s1 = Stream.of(10,20,30,40);//Stream本身就是一个整体,相当与充当一个数组
       //集合流
       Stream<String> s2 = lists.stream();

       //合并流:两两合并
       Stream<Object> allStream = Stream.concat(s1,s2);//concat是静态方法,用类调,合并不一样类型的用Object接
       allStream.forEach(System.out::println);

4 如何将流收回集合?

  1. 内容:需要注意流收回成集合后不能在重复收集,否则会程序会挂起
  2. 代码
        List<String> lists = new ArrayList<>();
        lists.add("赵敏");
        lists.add("小昭");
        lists.add("殷素素");
        lists.add("周芷若");
        lists.add("张无忌");
        lists.add("张三丰");
        lists.add("张三丰");

        Stream<String> zhangLists = lists.stream().filter(s->s.startsWith("张"));

        //把Stream流转换成Set集合
        Set<String> sets = zhangLists.collect(Collectors.toSet());
        System.out.println(sets);//set是不重复的

        //把Stream流转换成List集合
        Stream<String> zhangLists1 = lists.stream().filter(s->s.startsWith("张"));//再来一个新的流
        List<String> list = zhangLists1.collect(Collectors.toList());
        System.out.println(list);//会报错,挂起,原因是set已经把水管里的水给取完了

        //把Stream转成数组
        Stream<String> zhangLists2 = lists.stream().filter(s->s.startsWith("张"));//再来一个新的流
        Object[] arrs = zhangLists2.toArray();//直接转数组
        //硬要是String接数组,可以借用构造器引用申明转换成的数组类型
        String[] arrs1 = zhangLists2.toArray(String[]::new);

相关文章:

  • VMware安装Android-x86示例
  • [HUBUCTF 2022 新生赛]
  • 【Machine Learning】13.逻辑回归小结and练习
  • Cadence Allegro 过孔通孔盲孔埋孔详细说明及设计举例图文教程
  • Spring boot再来一遍
  • Mathorcup数学建模竞赛第三届-【妈妈杯】B题:关于三维健康评分模型的研究(附带赛题解析获奖论文)(一)
  • 最新版本vscode 真正解决用vscode + unity搭配开发没有代码智能提示 OmniSharp服务启动 vscode调试unity准备
  • T1064 奥运奖牌计数(信息学一本通C++)
  • python爬虫--cookie、防盗链、代理
  • Vue3+TSX开发模式下内置组件的替代方案
  • 燃烧化学平衡判据
  • 05--Django视图层-JsonResponse对象、request对象中的其他方法以及FBV与CBV的书写
  • Spring中Bean的生命周期详解
  • Linux文件之/etc/passwd和/etc/shadow
  • OCR - 微软windows 11系统自带的Windows OCR功能初体验
  • [数据结构]链表的实现在PHP中
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【前端学习】-粗谈选择器
  • Android Studio:GIT提交项目到远程仓库
  • DOM的那些事
  • Elasticsearch 参考指南(升级前重新索引)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 最常见的 200+ 面试题:面试必备
  • Javascript Math对象和Date对象常用方法详解
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Promise初体验
  • ViewService——一种保证客户端与服务端同步的方法
  • vue:响应原理
  • vue总结
  • Windows Containers 大冒险: 容器网络
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊redis的数据结构的应用
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入门级的git使用指北
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (MATLAB)第五章-矩阵运算
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)PySpark3:SparkSQL编程
  • (二)springcloud实战之config配置中心
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (转)为C# Windows服务添加安装程序
  • ******之网络***——物理***
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net framework profiles /.net framework 配置
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .Net语言中的StringBuilder:入门到精通
  • ??myeclipse+tomcat
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思