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

在业务系统中,数据一般都从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. 6、Spring教程之自动装配

    自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean有三种装配机制,分别是: 在xml中显式配置 ...

  2. 别再面向 for 循环编程了,JDK 自带的观察者模式就很香!

    大家好,你还在面向 for 循环编程吗? 还有谁不会用观察者模式吗? 本篇栈长带来<观察者模式>理论及实战- 什么是观察者模式? 观察者模式(Observer Pattern)定义了对象间 ...

  3. 关于生产环境改用G1垃圾收集器的思考

    背景 由于我们的业务量非常大,响应延迟要求高.目前沿用的老的ParNew+CMS已经不能支撑业务的需求.平均一台机器在1个月内有1次秒级别的stop the world.对系统来说是个巨大的隐患.所以 ...

  4. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  5. [图论]最优布线问题:prim

    最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...

  6. Java异常详解——一篇文章搞定Java异常

    目录 1. 异常的体系结构 2. 常见的异常 2.1 运行时异常 2.2 编译时异常 (编译时异常必须进行处理否则无法运行) 3. 异常的抓抛模型原理 4. 异常的处理 4.1 try - catch ...

  7. Spring (二)SpringIoC和DI注解开发

    1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...

  8. Go 包管理与依赖查找顺序

    目录 1. 规则: 2. 编译时的依赖包查找机制 3.vendor vendor的层级搜索 4. modules 1. 规则: 同一目录下只能存在一个包 目录和目录下源文件的包命名可以不同 当包名与目 ...

  9. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...

  10. kubernetes集群centos7初始化

    设置系统主机名以及 Host 文件的相互解析 hostnamectl set-hostname k8s-master01 安装依赖包 yum -y install wget net-tools nfs ...