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++;
            }
  • 相关阅读:
    JDK8:Lambda表达式
    静态代理模式
    javaEE servlet tomcat jsp对应关系
    cmake 实现交叉编译注意事项
    vector 初始化
    今儿谈谈:互联网创业公司,CTO,CFO,CEO们各负责什么?
    解答网友问:继续学习计算机还是转成会计专业!?如何做正确选择!
    谈谈关于男孩子学会计什么样?有没有发展钱途!
    代码时代!码农所创造财务机器人是财务人的解药还是毒药!?
    谈谈关于人工智能对财务会计行业的影响
  • 原文地址:https://www.cnblogs.com/wolbo/p/12112203.html
Copyright © 2011-2022 走看看