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

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

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

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

SQL中那么多函数,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></t> 把流中元素收集到List
  • toSet Set<t></t> 把流中元素收集到Set
  • toCollection Coolection<t></t> 把流中元素收集到Collection中
  • groupingBy Map<k,list<t>></k,list<t> 根据K属性对流进行分组
  • partitioningBy Map<boolean, list<t>></boolean,> 根据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 collect = lists.stream().filter(e -> e.getAge() > 18).collect(Collectors.toList());

根据会员类型分组

Map> collect3 = lists.stream()
        .collect(Collectors.groupingBy(vUser::getType));

统计总数

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

都可以很方便的操作。

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

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

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

Original: https://www.cnblogs.com/javazhiyin/p/14800714.html
Author: Java知音号
Title: SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573202/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 我入职腾讯啦

    蚂蚁金服上市的消息我想已经席卷了大家的朋友圈了,我也第一时间慰问了我所有蚂蚁的朋友,有期权的小伙伴都在估算自己变现后数字了,确实有很多老阿里人有财富自由的机会了,也有P7以下没期权…

    Java 2023年6月9日
    064
  • nginx内置全局变量及含义

    名称 版本 说明(变量列表来源于文件 ngx_http_variables ) $args 1.0.8 请求中的参数; $binary_remote_addr 1.0.8 远程地址…

    Java 2023年5月30日
    068
  • 线程同步

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    061
  • mybatis:字符串相等的比较

    必须得用toString()进行转换,否则比较不成功。 <sql id="where_kflb"> <choose> <when …

    Java 2023年5月30日
    090
  • JVM基础学习(一):JVM内存模型

    在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重…

    Java 2023年6月7日
    089
  • 毕业就在小公司躺了3年,面试大厂发现,发现不会分布式没人要…

    之前写了一篇秒杀系统的文章,最后给自己埋了分布式事务的坑,然后很多读者就要求我去写分布式事务,那作为程序员届的暖男,我一向是有求必应的,就算是不睡觉我都要写给你们看的! 因为分布式…

    Java 2023年6月9日
    095
  • 如何在idea上新建一个springboot项目

    https://blog.csdn.net/baidu_39298625/article/details/98102453 Original: https://www.cnblog…

    Java 2023年5月30日
    074
  • Node.js(六)连接MongoDB进行数据访问

    npm init -y(初始化项目) npm install mongodb –save(引入MongoDB) const { MongoClient } = requ…

    Java 2023年6月15日
    066
  • .NET 7 RC1 正式发布

    可以通过个网站( )跟踪.NET 7的issue 情况,今天截止还有36项在接下来的2个月时间内消灭。 下面是最新的燃尽图: 微软的公告主要回顾了与.NET MAUI、云原生最佳实…

    Java 2023年6月5日
    078
  • mybatis中log4j使用

    1.在pom.xml中引入maven依赖 1 <dependency> 2 <groupId>log4jgroupId> 3 <artifact…

    Java 2023年6月9日
    079
  • Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全…

    Java 2023年5月30日
    076
  • springboot 模拟上次文件: MultipartFile + json餐食

    首先来看,接口及参数 postman模拟上传 需求:将生成好的,远程excel附件,以及一些常规数据通过接口,传递过去。 代码部分: 1.将远程excel附件,转化为Multipa…

    Java 2023年5月30日
    086
  • Spring框架中使用了哪些设计模式及应用场景

    1、工厂模式 2、模板模式 3、代理模式 4、策略模式 5、单例模式 6、观察者模式 7、适配器模式 8、装饰者模式 Original: https://www.cnblogs.c…

    Java 2023年6月14日
    075
  • 【每天学一点-01】 在SpringBoot项目中使用Swagger2

    今天在做毕设的时候,发现在前后端分离的情况下,去调用接口数据时很不方便,然后回想过去,和同学一起做项目的时候,他负责后端,我负责前端,当时调用他的弄好的接口可以说是非常方便,主要是…

    Java 2023年6月5日
    091
  • ELK多租户方案

    一、前言 日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软…

    Java 2023年6月6日
    0182
  • 订单缓存查询实践

    最近在做订单缓存查询相关需求,记录下该过程中缓存查询考虑的几个问题以及处理方案。 实际场景中使用缓存都是先去缓存中查询,如果缓存没有命中,在去查询数据库并将结果缓存。如果查询一个在…

    Java 2023年6月7日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球