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++;
            }
  • 相关阅读:
    java中&和&&
    java保留字
    最优路径算法合集(附python源码)(原创)
    十大经典排序算法(python实现)(原创)
    电子欠款单设想(原创)
    羽毛球友谊赛规则(附带程序)(原创)
    基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
    lazy_import源码解析(原创)
    多线程的音频打标记的python实现(原创)
    关于塔防游戏的浅析(原创)
  • 原文地址:https://www.cnblogs.com/wolbo/p/12112203.html
Copyright © 2011-2022 走看看