有个同学提出一个这样的疑问;

在业务系统中,数据一般都从sql中查询,类似使用where,order by,limit,聚合函数等,为什么还要用java8的Stream方法?

对这个问题,大家有什么见解,欢迎评论区留言

首先,我们可以看下Stream的方法。

stream三种创建方式

  • 集合 Collection.stream()
  • 静态方法 Stream.of
  • 数组 Arrays.stream

Stream的终止操作

  • foreach(Consumer c) 遍历操作
  • collect(Collector) 将流转化为其他形式
  • max(Comparator) 返回流中最大值
  • min(Comparator) 返回流中最小值
  • count 返回流中元素综述

Collectors 具体方法

  • toList List<T> 把流中元素收集到List
  • toSet Set<T> 把流中元素收集到Set
  • toCollection Coolection<T> 把流中元素收集到Collection中
  • groupingBy Map<K,List<T>> 根据K属性对流进行分组
  • partitioningBy Map<boolean, List<T>> 根据boolean值进行分组

Stream的中间操作

  • filter(Predicate) 筛选流中某些元素
  • map(Function f) 接收流中元素,并且将其映射成为新元素,例如从student对象中取name属性flatMap(Function f) 将所有流中的元素并到一起连接成一个流
  • peek(Consumer c) 获取流中元素,操作流中元素,与foreach不同的是不会截断流,可继续操作流
  • distinct() 通过流所生成元素的equals和hashCode去重
  • limit(long val) 截断流,取流中前val个元素
  • sorted(Comparator) 产生一个新流,按照比较器规则排序
  • sorted() 产生一个新流,按照自然顺序排序

匹配

  • booelan allMatch(Predicate) 都符合
  • boolean anyMatch(Predicate) 任一元素符合
  • boolean noneMatch(Predicate) 都不符合

以上列举了一些Stream()常用操作方法,其实大部分在SQL中都能实现,同时类似Oracle,MySQL等数据库,有无数大牛用了十几年的时间帮我们做这些操作的优化处理,自带优化到极致的索引和缓存。所以如果在数据量大的情况下,有条件使用SQL处理,理论上比Stream提供的方法要快。

Stream大部分功能重叠了SQL自带函数方法,既然这样,Java8为什么还要提供这类API呢,效率你又干不过人家?

Stream有自己的使用场景,现在微服务越来越流行,一个系统被拆N多个服务,每个服务又使用不同的数据库,但是往往不同服务之间,在数据上有交叉。这种情况下,在SQL上的处理就会变得很麻烦。

比如,现在有A服务(会员管理),存储了会员信息,包括会员等级、登记日期、近期消费情况等。B服务(注册用户管理),存储了用户基本信息,包括住址、联系电话、生日等;想要总览会员信息,VVIP会员需要在生日时候送上一条彩信祝福和一款不值钱的库存商品作为礼物。

统计或者总览会员信息的时候,你就没办法用一条SQL去搞定了,这时候,Stream的分组,过滤,匹配等函数就发挥了作用。Java8之前,这些操作可能需要用循环或者iterator来做,比较繁琐,而Stream流可以很顺畅的一口气实现之前需要大段代码才能实现的功能。

如:

筛选大于18岁的会员

List<VIPUsers> collect = lists.stream().filter(e -> e.getAge() > 18).collect(Collectors.toList());

根据会员类型分组

Map<String, List<VIPUsers>> collect3 = lists.stream()
.collect(Collectors.groupingBy(vUser::getType));

统计总数

long count = lists.stream().count();

都可以很方便的操作。

Stream是Java8对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。在日常开发中使用Stream,开发效率更快,代码更加简洁。

但是需要注意的是,不要过分依赖Stream操作,常用的过滤聚合分组等操作,如果Stream和SQL都能处理的场景下,更建议去使用SQL去操作,尤其是数据量大的情况下,要充分利用数据库自带的缓存和索引,不要想着自己去优化。

老潘说过,叔怕你把握不住啊孩子,让数据库来!!!

SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?的更多相关文章

  1. sql语句删除由于无主键导致完全重复的数据方法

    sql语句删除由于无主键导致完全重复的数据方法 select distinct * into #Tmp from t_column drop table t_column select * into ...

  2. 【转】SQL中的锁、脏读、不可重复的读及虚读

    原文:http://blog.csdn.net/wjeson/article/details/9382067 锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题 ...

  3. sql中in/not in 和exists/not exists的使用方法差别

    1:首先来说in/not in的使用方法 in/not in是确定单个属性的值是否和给定的值或子查询的值相匹配: select * from Student s where s.id in(1,2,3 ...

  4. 深度分析:java8的新特性lambda和stream流,看完你学会了吗?

    1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...

  5. 【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?

    写在前面 在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是 ...

  6. 在SQL中使用CLR提供基本函数对二进制数据进行解析与构造

      二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换. 现借助CLR提 ...

  7. 解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题

    最近想试着学习ASP.NET MVC,在点击 添加--新建项--Visual C#下的数据中的ADO.NET 实体数据模型,到"选择您的数据连接"时,出现错误,"在 .N ...

  8. SQL中索引的原理

    (一)深入浅出理解索引结构         实际上,您可以把索引理解为一种特殊的目录.微软的SQL   SERVER提供了两种索引:聚集索引(clustered   index,也称聚类索引.簇集索引 ...

  9. SQL中的全局变量和局部变量(@@/@)

    在SQL中,我们常常使用临时表来存储临时结果,对于结果是一个集合的情况,这种方法非常实用,但当结果仅仅是一个数据或者是几个数据时,还要去建一个表,显得就比较麻烦,另外,当一个SQL语句中的某些元素经常 ...

随机推荐

  1. markdown的基础语法

    一级标题,一个#加空格 二级标题,两个#加空格 三级标题,三个#加空格 四级标题,四个#加空格 五级标题,五个#加空格 六级标题(最多支持到六级),六个#加空格 字体 粗体,两边加两个星号 斜体,两边 ...

  2. 抗DDOS应急预案实践-生产环境总结-建议必看

    一.首先摸清楚环境与资源 为DDoS应急预案提供支撑 所在的网络环境中,有多少条互联网出口?每一条带宽多少? 每一条互联网出口的运营商是否支持DDoS攻击清洗,我们是否购买,或可以紧急试用?当发生DD ...

  3. [BFS]最优乘车

    最优乘车 题目描述 HH 城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士站出发,依 ...

  4. ASP.NET扩展库之Http日志

    最佳实践都告诉我们不要记录请求的详细日志,因为这有安全问题,但在实际开发中,请求的详细内容对于快速定位问题却是非常重要的,有时也是系统的强力证据.Xfrogcn.AspNetCore.Extensio ...

  5. 消息中间件rabbitMQ

    1 为什么使用消息队列啊? 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这 ...

  6. 测开新手:从0到1,自动化测试接入Jenkins学习

    大家好,我叫董鑫,一个在测试开发道路上的新手,之前一直从事手工功能测试,前段时间抽空又温习了一遍老师全栈测开训练营中自动化测试.CICD的知识,最近公司正好有一个项目可以实践练手,趁热打铁,将自动化测 ...

  7. Semaphore自白:限流器用我就对了!

    大家好,我是 Semaphore,我的中文名字叫"信号量",我来自 JUC(java.util.concurrent)家族. 我们家族有很多优秀的成员,比如:CountDownLa ...

  8. 2、ASP.NET Core中服务的生命周期

    ASP.NET Core支持依赖注入软件设计模式,它允许在不同的组件中注入我们的服务,并且控制服务的初始化.有些服务可以在短时间内初始化,并且只能在某个特别的组件,以及请求中才能用到:而还有一些服务, ...

  9. 【Spring】循环依赖

    @ 目录 循环依赖 是什么? Spring是如何解决的? 源码分析 细节 循环依赖 是什么? ​ 简单的来说就是对象a的属性中引用了对象b,对象b的属性中引用了对象c......最后引用到a. < ...

  10. 0704-使用GPU加速_cuda

    0704-使用GPU加速_cuda 目录 一.CPU 和 GPU 数据相互转换 二.使用 GPU 的注意事项 三.设置默认 GPU 四.GPU 之间的切换 pytorch完整教程目录:https:// ...