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

在业务系统中,数据一般都从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. [倍增][换根DP]luogu P5024 保卫王国

    题面 https://www.luogu.com.cn/problem/P5024 分析 可以对有限制的点对之间的链进行在倍增上的DP数组合并. 需要通过一次正向树形DP和一次换根DP得到g[0][i ...

  2. BST(二叉搜索树)的基本操作

    BST(二叉搜索树) 首先,我们定义树的数据结构如下: public class TreeNode { int val; TreeNode left; TreeNode right; public T ...

  3. 给Nginx配置日志格式和调整日期格式

    效果对比 官方默认日志格式 # 官方默认日志格式 log_format main '$server_name $remote_addr - $remote_user [$time_local] &qu ...

  4. 谷歌SRE运维模式解读

    谷歌SRE运维模式解读 前面我和你分享了一些关于运维组织架构和协作模式转型的内容,为了便于我们更加全面地了解先进的运维模式,今天我们再来谈一下谷歌的SRE(Site Reliability Engin ...

  5. 百度地图一套JS API,非常实用

    百度地图一套JS API,非常实用 import mapStyleJson from "./mapStyleJson"; import $ from "jquery&qu ...

  6. 三、python学习-常用模块

    一.常用模块 1.math数学模块 在计算机中,所有数值在计算机底层都是约等于机制,并不是精确地 import math #ceil() 向上取整操作 math.ceil(3.1)=>4 #fl ...

  7. Python面向对象的高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...

  8. Go-18-自动下载所有依赖包

    如何自动下载所有依赖包? 大部分情况下大家下载 Go 项目都是使用go get命令,它除了会下载指定的项目代码,还会去下载这个项目所依赖的所有项目. 但是有的时候我们的项目由于各种原因并不是通过go ...

  9. Pytorch系列:(一)常用基础操作

    各种张量初始化 创建特殊类型的tensor a = torch.FloatTensor(2,3) a = torch.DoubleTensor(2,3) ... 设置pytorch中tensor的默认 ...

  10. hdu1428 spfa+记忆化搜索

    题意:      题意坑爹,很容易误认成是做短路的条数,题意是给你一个图,让你从起点走到终点,问你有多少种走法,但有一个限制,假如你想从a走到b,必须满足终点到b的最短距离小于终点到a的最短距离. 思 ...