lambda表达式二之Stream流

2023-11-17

Stream流
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

集合讲的是数据,流讲的是计算

  • Stream自己不会存储元素
  • Stream不会改变源对象,会返回一个持有结果的新Stream。
  • Stream操作是延迟执行的,意味着会等待需要结果的时候才执行。

操作步骤

一、创建Stream

一个数据源,获取一个流
1.可以通过Collection系列集合提供的stream()或者parallelStream()
2.通过Arrays中静态方法stream()获取数组流
3.通过Stream类中的静态方法of()
4.创建无限流,迭代 Stream.iterate()或者生成 Stream.generate()

二、中间操作

一个中间操作链,对数据源的数据进行处理

  1. 筛选与切片
    在这里插入图片描述
public class StreamTest {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("22");
        list.add("333");
        list.add("55555");
        list.add("55555");
        list.add("6666666");
        list.stream().skip(3)
                .filter(x -> x.length() > 2)
                .limit(2)
                .distinct()
                .forEach(System.out::println);
    }

输出为55555
2. 映射

public class StreamTest {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("bb");
        ArrayList<String> listA = new ArrayList<>();
        listA.add("111");
        list.stream().map(x->x.toUpperCase())
                .forEach(System.out::println);
        listA.stream().mapToInt(x->Integer.valueOf(x))
                .forEach(System.out::println);
    }
}
  1. 排序
    在这里插入图片描述
public class StreamTest {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("ccc");
        list.add("dddd");
        list.add("aa");
        list.add("bbb");
        list.add("ccc");
        //compare
        list.stream().sorted()
                .forEach(System.out::println);
        //comparator
        List<String> collect = list.stream().sorted((x, y) -> {
            if (x.length() > y.length())
                return 1;
            return 0;
        }).collect(Collectors.toList());
        System.out.println(collect);

    }
}

三、终止操作
执行中间操作链,并产生结果。
其结果可以是任何不是流的值。

  • allMatch:检查是否匹配所有元素
  • anyMatch:检查是否至少匹配一个元素
  • noneMatch:检查是否没有匹配所有元素
  • findFirst:返回第一个元素
  • findAny:返回当前流中的任意元素
  • count:返回流中元素的总个数
  • max:返回流中最大值
  • min:返回流中最小值
public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("eee");
        list.add("ccc");
        list.add("dddd");
        list.add("aa");
        list.add("bbb");
        list.add("ddd");

        //allMatch
        boolean a = list.stream().filter(x -> x.length() > 2)
                .allMatch(x -> x.equals("ccc"));
        System.out.println(a);

        //findFirst
        String b = list.stream().filter(x -> x.length() > 2)
                .findFirst().get();
        System.out.println(b);

        //findFirst
        String c = list.stream().filter(x -> x.length() > 2)
                .findAny().get();
        System.out.println(c);

        //max
        String max = list.stream().filter(x -> x.length() > 2)
                .max((x,y) ->Integer.compare(x.length(),y.length())).get();
        System.out.println(max);
    }

在这里插入图片描述

归约

可以将流中的元素反复结合起来,得到一个值

//第一个参数为起始值
 reduce(T identity,BinaryOperator)reduce(BinrayOperator)
        //int类型
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        Integer reduce = integers.stream().reduce(0, (x, y) -> x + y);
        System.out.println(reduce);
        //String类型
        List<String> strings = Arrays.asList("a", "bb", "cc", "dd");
        strings.stream().reduce(String::concat);
收集

将流转换成其他形式,接收一个Collector接口实现
用于给Stream中元素做汇总的方法

public class StreamTest2 {

   List<Employee> emps = Arrays.asList(
           new Employee(1, "一一", 18),
           new Employee(2, "二二", 28),
           new Employee(3, "三三", 38),
           new Employee(4, "司司", 48),
           new Employee(5, "五五", 48),
           new Employee(6, "溜溜", 58)
   );


   /**
    * 收集
    * collect -- 将流转换成其他形式,接收一个Collector接口实现,
    * 用于给Stream中元素做汇总的方法
    **/
   public void test1() {
       List<String> list = emps.stream()
               .map(x -> x.getMame())
               .collect(Collectors.toList());
       list.forEach(System.out::println);

       System.out.println("---------------------");

       Set<String> set = emps.stream()
               .map(x -> x.getMame())
               .collect(Collectors.toSet());
       set.forEach(System.out::println);

       HashSet hs = emps.stream()
               .map(x -> x.getMame())
               .collect(Collectors.toCollection(HashSet::new));
       hs.forEach(System.out::println);


       //总数
       Long count = emps.stream()
               .collect(Collectors.counting());
       System.out.println(count);

       //平均值
       Double avg = emps.stream()
               .collect(Collectors.averagingInt(Employee::getAge));
       System.out.println(avg);

       //总和
       Integer num = emps.stream()
               .collect(Collectors.summingInt(Employee::getAge));
       System.out.println(num);

       //最大
       Optional<Employee> op = emps.stream()
               .collect(Collectors.maxBy(
                       (e1,e2) ->Integer.compare(e1.getAge(), e2.getAge())));
       System.out.println(op.get());


       //分区
       Map<Boolean, List<Employee>> map3 = emps.stream()
               .collect(Collectors.partitioningBy((e) -> e.getAge() > 40));
       System.out.println(map3);

       //统计
       DoubleSummaryStatistics dss = emps.stream()
               .collect(Collectors.summarizingDouble(Employee::getAge));
       System.out.println(dss.getSum());
       System.out.println(dss.getAverage());
       System.out.println(dss.getMax());

       //连接
       String str = emps.stream()
               .map(x->x.getMame())
               //.collect(Collectors.joining(""));//只是拼接收到字符什么都不加
               //.collect(Collectors.joining(","));//每个名字中间增加一个逗号
               .collect(Collectors.joining(",", "----", "===="));//字符串首尾加特殊字符
       System.out.println(str);
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lambda表达式二之Stream流 的相关文章

随机推荐

  • 【3月比赛合集】45场可报名的数据挖掘奖金赛,任君挑选!

    CompHub 实时聚合多平台的数据类 Kaggle 天池 和OJ类 Leetcode 牛客 比赛 本账号同时会推送最新的比赛消息 欢迎关注 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考 以比赛官网为准 目录
  • k8s部署之ETCD集群

    k8s部署之ETCD集群 1 etcd下载 etcd下载地址 https github com coreos etcd releases 从github etcd的发布页面选取相应的版本用 wget url 来下载 如 wget https
  • 【易售小程序项目】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】

    文章目录 界面效果 界面实现 工具js 页面 首页 让文字只显示两行 路由跳转传递对象 将商品分为两列显示 使用中划线划掉原价 后端 商品 controller service mapper sql 同项目其他文章 界面效果 说明 界面中商
  • Docker容器中如何运行一个带GUI的app?

    问 How can you run GUI apps in a docker container Are there any images that set up vncserver or something so that you can
  • 图像处理之-----插值算法

    插值算法是图像处理中最基本的算法 首先我们先了解一下什么是插值算法 以及插值算法在图像处理过程中的应用 1 什么是插值 Interpolation is a method of constructing new data points wi
  • Redis 密码设置和查看密码

    Redis 密码设置和查看密码 redis没有实现访问控制这个功能 但是它提供了一个轻量级的认证方式 可以编辑redis conf配置来启用认证 1 初始化Redis密码 在配置文件中有个参数 requirepass 这个就是配置redis
  • Python软件开发之需求实现:数据结构、数据类型。自动化软件测试必会

    一 有这样的一个需求 判断学生成绩是否及格 二 拿到这样的一个需求如何进行需求分析呢 做为测试人员 我们只有明确需求后 才不容易漏测 需求分析阶段 一 看到这样的一句话之后我们有几个问题需求和产品经理确认的 1 什么样的算及格 60 70分
  • Spark 启动集群 Master 正常启动 Worker 不启动

    在学习spark过程中遇到的问题 做下记录 这个问题网上出现的不再少数 出现问题的原因也是各不相同 并且没有一个人的问题和我完全一样 我高兴得都快哭了 顺着大家的思路 尝试了两个多小时才搞明白 问题的根源大多都在于 hostname 的配置
  • C++ STL - vector 模拟实现+解析迭代器

    目录 vector使用 vector模拟实现 vector实现解析 memcpy进行元素拷贝问题 扩容问题 vector迭代器解析 vector迭代器失效问题 1 示例一 一个典型的迭代器失效bug insert实现 2 示例二 inser
  • 记录一些可能会用到资料

    1 win11子系统WSL修改用户密码 以管理员身份打开 PowerShell 输入命令 wsl exe user root passwd root 修改 root 用户密码 2 layDate控件在页面高度不够的情况下闪退 在laydat
  • 8x8LED点阵

    点量这个只需要把9高电平 13低电平就可以了 共阳极点阵 行线是led的正极 列线是led的列线 左上角点亮 显示多个灯是动态扫描的 一个一个显示的 然后间隔速度要快就可以造成显示 点阵由两篇74Hc595级联在一起驱动的 只需要三个io口
  • matplotlib输出图形到网页_Python实操:手把手教你用Matplotlib把数据画出来

    导读 获取数据之后 而不知道如何查看数据 用途还是有限的 幸好 我们有Matplotlib Matplotlib 是基于 NumPy 数组构建的多平台数据可视化库 它是John Hunter 在2002年构想的 原本的设计是给 IPytho
  • 【LeetCode与《代码随想录》】哈希表篇:做题笔记与总结-JavaScript版

    文章目录 代码随想录 主要题目 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和 经典哈希 454 四数相加 II 15 三数之和 双指针 18 四数之和 双指针 相关题目 383 赎金信 49 字母异位词分组
  • mnist数据集之自己写的数字

    这是我自己用画图3D写的数字0 9 然后又把它们修改成了28 28像素的格式 并经过测试后输出了预测值 不知道怎么搞得 顺序打乱了 这是我测试后的结果 要加油哦
  • C语言——执行创建多个文件同时写入内容

    代码 include
  • Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。

    多种方法实现文件 目录监听 1 引言 2 代码实战 2 1 os模块 2 2 watchdog库 2 2 1 安装 2 2 2 示例 2 3 inotify 2 3 1 安装 2 3 2 示例 3 总结 1 引言 小屌丝 鱼哥 帮我看下这段
  • 说透 Nacos 一致性协议

    1 Nacos 致性协议 1 1 为什么 Nacos 需要 致性协议 Nacos尽可能减少用户部署以及运维成本 做到用户只需要 个程序包 就快速单机模式启动 Nacos 或集群模式启动 Nacos 而 Nacos 是 个需要存储数据的组件
  • java基础—HashMap实现原理,如何保证HashMap的线程安全

    在多线程条件下 容易导致死循环 具体表现为CPU使用率100 因此多线程环境下保证 HashMap 的线程安全性 主要有如下几种方法 1 替换成Hashtable Hashtable通过对整个表上锁实现线程安全 因此效率比较低 2 使用Co
  • 台式计算机的配置怎么看,台式电脑配置怎么看

    电脑的性能 价格决定于电脑的配置 很多人电脑新手在购买电脑的时候对电脑配置的相关情况不太了解 导致新买的电脑频频出问题 所以了解自己电脑配置是很重要的 这里我们就简单的来说说台式电脑配置怎么看 电脑配置一般CPU 显卡 主板 内存 硬盘 显
  • lambda表达式二之Stream流

    Stream流 是数据渠道 用于操作数据源 集合 数组等 所生成的元素序列 集合讲的是数据 流讲的是计算 Stream自己不会存储元素 Stream不会改变源对象 会返回一个持有结果的新Stream Stream操作是延迟执行的 意味着会等