有时候需要对数据进行批处理,尤其是使用mybatis进行批量插入的时候。

skip+limit学习

1,skip(long n) 方法跳过前 n (非负)个元素,返回剩下的流,有可能为空流

2,limit(long maxSize): 方法截断其前个maxSize元素;若原流中包含的元素个数小于maxSize,那就获取其所有的元素;

skip

    public static void main(String[] args) {skip();}// skip(long n) 方法跳过前 n (非负)个元素,返回剩下的流,有可能为空流。public static void skip() {List<String> names = Arrays.asList("ling", "lian", "yan", "feng", "yun", "wen", "tian", "lang", "xiu");String skipFirstName = names.stream().skip(0).findFirst().orElse("");System.out.println("skipFirstName: " + skipFirstName);String skipLastName = names.stream().skip(names.size() - 1).findFirst().orElse("");System.out.println("skipLastName: " + skipLastName);names = Collections.singletonList("yan");// 超出报错String penultName = names.stream().skip(names.size() - 2).findFirst().orElse("");System.out.println("reduce penultName: " + penultName);}

第三个超出,就报错了。

limit:

     public static void main(String[] args) {limit();}// limit(long n): 方法截断其前个n元素;若原流中包含的元素个数小于n,那就获取其所有的元素;public static void limit() {List<String> names = Arrays.asList("ling", "lian", "yan", "feng", "yun", "wen", "tian", "lang", "xiu");List<String> limit1 = names.stream().limit(5).collect(Collectors.toList());System.out.println("inner size: " + limit1);List<String> limit2 = names.stream().limit(25).collect(Collectors.toList());System.out.println("over size: " + limit2);}

结果:

inner size: [ling, lian, yan, feng, yun]
over size: [ling, lian, yan, feng, yun, wen, tian, lang, xiu]

skip+limit批处理

    public static void main(String args[]) {List<Integer> datas = new ArrayList<>();for (int i = 0; i < 26; i++) {datas.add(i);}skipData2(datas, 5);System.out.println("===========");skipData2(datas, 6);}public static void skipData1(List<Integer> datas, int maxSize){int dataSize = datas.size();// 向上取整
//        int loop =  dataSize / maxSize + (dataSize % maxSize != 0 ? 1 : 0);int loop =(int) Math.ceil(dataSize * NumberUtils.DOUBLE_ONE / maxSize);List<Integer> skipData;for (int i = 0; i < loop; i++) {skipData = ListUtils.emptyIfNull(datas).stream().skip(i * maxSize).limit(maxSize).collect(Collectors.toList());System.out.println(skipData);}}public static void skipData2(List<Integer> datas, int maxSize){List<Integer> skipData;for (int offset = 0, listSize = datas.size(); offset < listSize; offset += maxSize) {skipData = datas.stream().skip(offset).limit(maxSize).collect(Collectors.toList());System.out.println(skipData);}}

结果:

[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
[25]
===========
[0, 1, 2, 3, 4, 5]
[6, 7, 8, 9, 10, 11]
[12, 13, 14, 15, 16, 17]
[18, 19, 20, 21, 22, 23]
[24, 25]

第一种更符合分页的那种习惯写法。

应用:

mybatis 使用foreach进行批量插入的时候,因为默认执行器类型为Simple,会为每个语句创建一个新的预处理语句,也就是创建一个PreparedStatement对象。在我们的项目中,会不停地使用批量插入这个方法,而因为MyBatis对于含有的语句,无法采用缓存,那么在每次调用方法时,都会重新解析sql语句。而且PreparedStatement特别长,包含了很多占位符,对于占位符和参数的映射尤其耗时。

因此使用foreach进行插入,一次性插20~50行数量是比较合适的,时间消耗也能接受。 这时候就用到上面批处理数据了。

总结:

使用skip和limit适合对数据进行批处理。

java8 skip和limit学习使用相关推荐

  1. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  2. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  3. 在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections

    到目前为止,我们已经讨论了创建文档, 检索文档,现在让我们来研究一下文档排序,指定要跳过或限制返回的文档数量,以及如何进行投影.此篇文章中的实例代码摘录自原文,未像前几篇文章一样进行实际代码的验证. ...

  4. 图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  5. java8新特性-stream学习

    java8除了提供了Lambda表达式,操作集合的Stream API也是新特性中最值得学习和掌握的,它大大简化了,我们操作数据集合的代码量的书写.简单来说Stream是一个抽象概念,可以通过查找,过 ...

  6. java8新特新学习笔记

    jdk8新特性内容概述 lambad表达式 函数式接口 方法引用与构造器引用 StreamAPI optinal类 jdk8新特性简介 jdk8(又称为java8)是java开发的一个主要版本.jdk ...

  7. Java 8 Stream Api 中的 skip 和 limit 操作

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 Java 8 Stream API 中的sk ...

  8. Java基础学习总结(132)——Java8 Stream流操作学习总结

    传统的数据处理都是用循环来解决,而不是像搜索数据库那样有具体的搜索语句,而Java8的Stream提供了很好的方案,往往一行就搞定了,而且Stream还可以链式操作,一行代码实现多个循环的功能,代码风 ...

  9. java8 stram并行流学习

    关于steam基本用法https://www.jianshu.com/p/11c925cdba50这篇博客中已经有了详细的介绍 并行流需要注意的地方: 并行流分解任务基于fork/join 框架 fo ...

最新文章

  1. 初试Ajax.Net !
  2. 你的工作是为了你自己!
  3. PostgreSQL 函数调试、诊断、优化 auto_explain
  4. matlab保存数据到excel_Excel意外退出数据未保存?这个方法可以帮你找回所有数据...
  5. 面试项目亮点_程序员面试时这样介绍自己的项目经验,等于成功了一大半
  6. Cookie禁用了Session还可以用吗?
  7. bzoj 1296: [SCOI2009]粉刷匠(DP+DP)
  8. AVS2/AVS3测试视频和VLC播放器
  9. html英雄联盟网页,Html+Css+JQuery实现简易英雄联盟官网
  10. SpringSecurity实战(七)-对接第三方登陆-流程分析
  11. M - Help Hanzo
  12. 【PID优化】基于蝗虫算法PID控制器优化设计含Matlab源码
  13. Flutter 开发错误集合二
  14. 计算机控制系统课程设计交通灯,太原理工大学数字逻辑课设(交通灯)
  15. python--真气网监测站点数据的抓取
  16. PCS/MES/ERP各层内容
  17. JAVA中Action层, Service层 ,model层 和 Dao层的功能区分
  18. linux dns劫持转发,linux的dns被劫持(解决方案)
  19. XXOO 传说90黑阔论坛
  20. 服务器电源维修成都,成都电力电源维修

热门文章

  1. 2016-12-19
  2. 【Flask学习记录】
  3. javascript名字由来
  4. mysql explain结果_MySQL EXPLAIN用法和结果分析
  5. ORAN专题系列-2:O-RAN的系统架构
  6. 使用kindeditor插件报editor is not defined 问题
  7. od机考真题-查找众数以及中位数
  8. 液压安全阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. 李航老师《统计学习方法》第八章课后习题答案
  10. 信息系统项目管理师论文-项目整体管理