java8 流Stream 高级使用

42 篇文章 2 订阅
订阅专栏

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

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

熟悉Linux的同学对这种风格一定不陌生,因为它跟Linux的|管道符的思想如出一辙。上面这段话引用自runoob.com,但是其教学代码都是基于String列表进行演示,考虑到实际情况百分之80的时候都是对PO、VO进行处理,因此以下通过一个PO进行讲解。

对比起for循环操作list,最大的弊端就是代码太长太乱了,如果涉及3-4张表的操作,也就是涉及多个PO操作,那个括号简直就是俄罗斯套娃,写到最后真的自己都不知道在写什么

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

PO代码

以下操作均以UserPo进行讲解

注 意

 文末有:7701页互联网大厂面试题 

filter

filter:过滤,就是过滤器,符合条件的通过,不符合条件的过滤掉

// 筛选出成绩不为空的学生人数
count = list.stream().filter(p -> null != p.getScore()).count();

map

map:映射,他将原集合映射成为新的集合,在VO、PO处理的过程中较常见。在本例子中,原集合就是PO集合,新集合可以自定义映射为成绩集合,同时也可以对新集合进行相关操作

// 取出所有学生的成绩
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());

// 将学生姓名集合串成字符串,用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

sorted

sorted:排序,可以根据指定的字段进行排序

// 按学生成绩逆序排序 正序则不需要加.reversed()
filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());

forEach

forEach:这个应该是最常用的,也就是为每一个元素进行自定义操作]

除了forEach操作会改变原集合的数据,其他的操作均不会改变原集合,这点务必引起注意

collect

collect:聚合,可以用于GroudBy按指定字段分类,也可以用于返回列表或者拼凑字符串

// 按成绩进行归集
Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));
for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {
   
     
    System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
}

// 返回list
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
// 返回string用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

statistics

statistics:统计,可以统计中位数,平均值,最大最小值

parallelStream

parallelStream:并行流,可以利用多线程进行流的操作,提升效率。但是其不具备线程传播性,因此使用时需要充分评估是否需要用并行流操作

// 并行流
count = list.parallelStream().filter(p -> null != p.getScore()).count();

完整代码

package com.cmx.tcn.stream;

/**
 * @author: Cai MinXing
 * @create: 2020-03-25 18:17
 **/
public class UserPo {
   
     
    private String name;
    private Double score;

    public UserPo(String name, Double score) {
   
     
        this.name = name;
        this.score = score;
    }

    public String getName() {
   
     
        return name;
    }

    public void setName(String name) {
   
     
        this.name = name;
    }

    public Double getScore() {
   
     
        return score;
    }

    public void setScore(Double score) {
   
     
        this.score = score;
    }

    @Override
    public String toString() {
   
     
        return "UserPo{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
package com.cmx.tcn.stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author: Cai MinXing
 * @create: 2020-03-25 18:15
 **/
public class StreamTest {
   
     

//    +--------------------+       +------+   +------+   +---+   +-------+
//    | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
//    +--------------------+       +------+   +------+   +---+   +-------+

    public static void main(String args[]){
   
     

        List<UserPo> list = new ArrayList<>();
        list.add(new UserPo("小一", 10.d));
        list.add(new UserPo("小五", 50.d));
        list.add(new UserPo("小六", 60.d));
        list.add(new UserPo("小6", 60.d));
        list.add(new UserPo("小空", null));
        list.add(new UserPo("小九", 90.d));

        long count = 0;
        List<UserPo> filterList = null;

        // filter 过滤器的使用
        // 筛选出成绩不为空的学生人数
        count = list.stream().filter(p -> null != p.getScore()).count();
        System.out.println("参加考试的学生人数:" + count);

        // collect
        // 筛选出成绩不为空的学生集合
        filterList = list.stream().filter(p -> null != p.getScore()).collect(Collectors.toList());
        System.out.println("参加考试的学生信息:");
        filterList.stream().forEach(System.out::println);

        // map 将集合映射为另外一个集合
        // 取出所有学生的成绩
        List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
        System.out.println("所有学生的成绩集合:" + scoreList);

        // 将学生姓名集合串成字符串,用逗号分隔
        String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));
        System.out.println("所有学生的姓名字符串:" + nameString);

        // sorted排序
        // 按学生成绩逆序排序 正序则不需要加.reversed()
        filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());
        System.out.println("所有学生的成绩集合,逆序排序:");
        filterList.stream().forEach(System.out::println);

        System.out.println("按学生成绩归集:");
        Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore())
                .collect(Collectors.groupingBy(UserPo::getScore));
        for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {
   
     
            System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
        }

        // forEach
        filterList.stream().forEach(p -> p.setScore(p.getScore() + 10));
        System.out.println("及格人数太少,给每个人加10分");
        filterList.stream().forEach(System.out::println);

        // count
        count = filterList.stream().filter(p -> p.getScore() >= 60).count();
        System.out.println("最后及格人数" + count);

        DoubleSummaryStatistics statistics = filterList.stream().mapToDouble(p -> p.getScore()).summaryStatistics();
        System.out.println("列表中最大的数 : " + statistics.getMax());
        System.out.println("列表中最小的数 : " + statistics.getMin());
        System.out.println("所有数之和 : " + statistics.getSum());
        System.out.println("平均数 : " + statistics.getAverage());

        // 并行流 使用
        count = list.parallelStream().filter(p -> null != p.getScore()).count();
        System.out.println("并行流处理参加考试的学生人数:" + count);

    }

}
Java Stream 高级使用全解
Hello, New World!
12-26 4003
Java Stream 高级使用全解一 基本汇总1. 创建2. 中间操作3. 终止操作二 经验累积1. 统计1.1 取最大值1.2 取最小值1.3 取总和值1.4 取平均值2. 过滤2.1 获取最近时间3. 排序3.1 根据字段排序4. 分组4.1 获取字段出现次数4.2 过滤并获取指定字段列表 Java 强大的 stream 处理,必会! 无状态:指元素的处理不受之前元素的影响; 有状态:指该操作只有拿到所有元素之后才能继续下去。 非短路操作:指必须处理所有元素才能得到最终结果; 短路操作:指遇
一些常见的Java8 循环实例(筛选、基本函数使用,循环等)
macenly的博客
06-23 1134
一些常见的Java8 循环实例(筛选、基本函数、list合并、转map等)
JDK8都10岁了,你还在用for循环遍历list吗?
Java知音
06-07 464
点击关注公众号,实用技术文章及时了解简介Java 8 API添加了一个新的抽象称为Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。熟悉L...
Java-8-基本循环
高万禄的博客
03-04 366
Java基本循环 package 玩转循环; public class Cycle { public static void main(){ /* Java与其他编程语言一样 提供个三种基本循环方式 @1 - while @2 - do while @3 - for */ int flag=10; //while循环 wh
java8循环_Java 8 新语法习惯 (for 循环的函数替代方案)
weixin_30662937的博客
02-12 1419
我们最常用的迭代一个数据集的方式就是 for 循环,开发人员对它可谓是非常的熟悉。从 Java 8 开始,我们有多个强大的新方法可以帮助我们简化复杂的迭代。在本文中,您将了解如何使用 InStream 方法、range、iterate 和 limit 来迭代范围和跳过范围中的值。还将了解新的 takeWhile 和 dropWhile 方法。for 循环的麻烦在 Java 语言的第一个版本中就开始...
Java入门】八 循环结构——for循环、while循环、do-while循环
m0_63948341的博客
08-29 358
循环是计算机可以帮我们做重复的大量的计算操作,比如要计算 1 + 2 + 3一直+,我们要+到100,我们可以直接写表达式,计算从 1 加到 1000,如果你一个一个加的方式去写代码,老板就要气疯了,此时我们就需要用循环了。从而方便我们的运算,提高我们的工作效率。...
java入门到精通2:java8Stream各种使用
最新发布
程序员句号的博客
03-12 1107
java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。
java8中Stream使用示例教程
08-26
Java 8 中的 Stream API 是一个强大的工具,它极大地简化了集合操作,使得代码更加简洁、易读。Stream API 的引入是为了支持函数式编程风格,它不仅提供了串行处理的能力,还支持并行处理,从而提高了程序的执行效率...
高级JAVAStream操作
m0_48922996的博客
07-15 685
关于JAVAStream的理解要点与使用技能的阐述就先到这里啦。那通过上面的介绍,各位小伙伴们是否已经跃跃欲试了呢?快去项目中使用体验下吧!
怎么break java8 stream的foreach
12-21
Java 8 Stream 的 foreach 知识点】 Java 8 引入了 Stream API,它提供了一种新的处理数据的方式,尤其是对于集合操作。在 Stream API 中,`forEach` 是一个常用的函数,用于对中的每个元素执行指定的操作。...
Java8处理List的双层循环问题
08-24
主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java8新特性 stream的方式遍历集合和数组操作
08-18
主要介绍了java8新特性 stream的方式遍历集合和数组操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Java 8:不要再用循环了
01-20
正如我之前所写的,Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界,并且是时候去适应它了。   在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,棒的特性是允许我们去表达我们想要完成什么而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实际表现。这迫使我们不仅要清楚我们要实现怎样的代码,还要了解循环是怎样工作的。   在介绍Java 8的Stream)时,我们学会了一些集合操作的实用技巧。现在我们要看看怎样把这些循环转换为更简洁,可
Java8之Stream代替For循环操作
08-24
主要介绍了Java8之Stream代替For循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
JAVA—08 循环与选择
博客
10-24 352
一、循环 1.for 2.while 3.do-while 4.continue与break 二.选择 1.if 2.switch
Stream高级用法-综合分组求和、组合排序、求极值
热门推荐
林高禄
06-09 1万+
还不清楚Steam用法的,可以先看这篇StreamStream,Lambda) 我们以下的例子都是基于这个学生类Student来操作,下面是学生类Student的代码 学生属性有:编号,名字,年龄,数学成绩,语文成绩,重写toString方法,重写equals和hashCode方法 package com.TestStream; /** * @author 林高禄 * @create 2020-06-04-16:47 */ public class Student { .
Java List Stream 遍历
鸟人的博客
06-30 3515
List Stream在实际开发中的应用比较多,其中List的Stream遍历更是常用,下面介绍两种List遍历的写法第一种,forEach方法 第二种,Stream处理
JDK8 循环遍历list
Admans的专栏
07-13 6127
熟悉Linux的同学对这种风格一定不陌生,因为它跟Linux的管道符的思想如出一辙。上面这段话引用自,但是其教学代码都是基于String列表进行演示,考虑到实际情况百分之80的时候都是对PO、VO进行处理,因此以下通过一个PO进行讲解。对比起for循环操作list,最大的弊端就是代码太长太乱了,如果涉及3-4张表的操作,也就是涉及多个PO操作,那个括号简直就是,写到最后真的自己都不知道在写什么 以下操作均以进行讲解filter:过滤,就是过滤器,符合条件的通过,不符合条件的过滤掉 map:映射
写文章

分类专栏

  • 计算机原理 1篇
  • 网络 1篇
  • 数据库 5篇
  • 设计模式 1篇
  • java 42篇
  • h5 9篇
  • 个人笔记 6篇
  • linux 12篇
  • redis 2篇

最新评论

  • Nacos配置中心交互模型原理

    lbingk: 你好,配置中心功能做根据key对值进行MD5比较,那如果只是在服务端新增配置,而客户端没有这个key,客户端在做长轮训的时候怎么知道这个新增的key啊?

  • 数据分层详解ODS、DWD、DWM、DWS、ADS

    暴走水煮鱼: 老师,请问为什么有的说贴源层是STG,有的说是ODS,这两个有什么区别,到底应该哪个是贴源层

  • 百度语音播报报错

    niubility2020: 换百度智能云那个收费的就行了,个人能免费用半年。这个样子的:http://tsn.baidu.com/text2audio?spd=4&vol=15&per=1&lan=zh&cuid=*****&ctp=1&tok=*****&tex=

  • 百度语音播报报错

    niubility2020: 换一个啊。这个免费的不能用了。换最新的百度智能云那个收费的就行了。看看我做的媒体复读机,就是用tts朗读中文的。 https://note.youdao.com/s/MI81scdr

  • windows10 无效ip 无法连接网络问题解决

    ☞雪没ᝰ有夏☜: 我的是提示无法获取dhcp服务表情包

大家在看

  • 力扣 88.合并两个有序数组 121.买卖股票的最佳时机 642
  • chatGpt4.0Plus,Claude3最新保姆级教程开通升级
  • 第五届应用力学与机械工程国际学术会议(ICAMME 2024)
  • 如何几千元就能搭建一个同城搭子运营陪玩系统?陪玩系统源码安装教程
  • 使用SQL在PostGIS中创建各种空间数据 483

最新文章

  • smiley-http-proxy-servlet做代理application/x-www-form-urlencoded请求类型,报错failed to respond
  • 畅谈RocketMQ重复消费7个根源问题
  • 手写服务限流6种实现方式
2024年1篇
2023年9篇
2022年14篇
2021年7篇
2020年7篇
2019年28篇
2018年18篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家宿迁玻璃钢雕塑景观设计福建大型主题商场美陈批发价温州从化玻璃钢人物雕塑包头玻璃钢雕塑制作商场春夏美陈方案安宁玻璃钢广场雕塑设计咨询上海玻璃钢广场雕塑厂家供应商场空厅美陈方案ppt天津玻璃钢雕塑家园南京镜面玻璃钢雕塑品牌企业山西玻璃钢广场雕塑怀化玻璃钢造型雕塑玻璃钢雕塑制作方法视频教程湖北玻璃钢彩绘雕塑制作汕尾玻璃钢动物雕塑费用是多少文山玻璃钢仿真雕塑新郑泡沫玻璃钢卡通雕塑公司肇庆玻璃钢卡通雕塑有哪些价值观玻璃钢卡通雕塑订做价格广州包头玻璃钢雕塑手糊玻璃钢花盆制作简单方案廊坊东莞玻璃钢卡通雕塑定做厂家新疆玻璃钢海豚雕塑玻璃钢雕塑打木架黑龙江玻璃钢雕塑哪家便宜济南景观小品玻璃钢雕塑湖南玻璃钢装饰雕塑周口玻璃钢雕塑制造西安恒达艺玻璃钢雕塑山东室内商场美陈怎么样香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化