zoukankan      html  css  js  c++  java
  • java 流不能复用 stream has already been operated upon or closed 内存分页

    场景

    //防止sql注入
        Stream<String> idList =accDocIDList.stream().map((x) ->
                    {
                    if (x.matches("[^a-zA-Z0-9-]"))
                    {
                        //throw new BalanceException("xxx-xxx", "hehe");
                        throw new RuntimeException("非法凭证ID");
                    }
                     return String.format("'%1$s'", x);
                });
    
            parameters = new IDbParameter[]
                    {
                            bqlExecuter.makeInParam("funcID", funcID),
                            bqlExecuter.makeInParam("userID", userID),
                            bqlExecuter.makeInParam("accOrgID", accOrgID),
                            bqlExecuter.makeInParam("AccLedgerID", ledger),
                            bqlExecuter.makeInParam("year", year),
                            bqlExecuter.makeInParam("flag", "1"),
                            bqlExecuter.makeInParam("accPeriodID", accPeriodID),
                    };
            //分页
            int pageSize = 900;
            int pageNum = 0;
            while (pageNum * pageSize < accDocIDList.size())
            {
                List<String> list = idList.skip(pageNum*pageSize).limit(pageSize).collect(Collectors.toList());  //此处会重新使用流 第二次循环会报错 stream has already been operated upon or closed 
                String idsql = bql + " and A.ID in (" + String.join(",", list) + ")";
                var ret = bqlExecuter.executeBqlStatement(idsql, refEntityIDs, parameters);
                pageNum++;
            }

    解决方法  使用Supplier

    //防止sql注入
            Supplier< Stream<String>> idList = ()->accDocIDList.stream().map((x) ->
                    {
                    if (x.matches("[^a-zA-Z0-9-]"))
                    {
                        //throw new BalanceException("xxx-xxx", "hehe");
                        throw new RuntimeException("非法凭证ID");
                    }
                     return String.format("'%1$s'", x);
                });
    
            parameters = new IDbParameter[]
                    {
                            bqlExecuter.makeInParam("funcID", funcID),
                            bqlExecuter.makeInParam("userID", userID),
                            bqlExecuter.makeInParam("accOrgID", accOrgID),
                            bqlExecuter.makeInParam("AccLedgerID", ledger),
                            bqlExecuter.makeInParam("year", year),
                            bqlExecuter.makeInParam("flag", "1"),
                            bqlExecuter.makeInParam("accPeriodID", accPeriodID),
                    };
            //分页
            int pageSize = 900;
            int pageNum = 0;
            while (pageNum * pageSize < accDocIDList.size())
            {
                List<String> list = idList.get().skip(pageNum*pageSize).limit(pageSize).collect(Collectors.toList());
                String idsql = bql + " and A.ID in (" + String.join(",", list) + ")";
                var ret = bqlExecuter.executeBqlStatement(idsql, refEntityIDs, parameters);
                pageNum++;
            }
  • 相关阅读:
    Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
    Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目
    Python 解析XML实例(xml.sax)
    深度学习Tensorflow相关书籍推荐和PDF下载
    气象netCDF数据可视化分析
    Python 操作MySQL 数据库
    用这个库 3 分钟实现让你满意的表格功能:Bootstrap-Table
    浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)...
    web开发工具flask中文英文书籍-持续更新
    Python 在气象上的应用
  • 原文地址:https://www.cnblogs.com/wolbo/p/12112203.html
Copyright © 2011-2022 走看看