如何将嵌套的for循环转换为并行流或任何替代方法来提高Java Springboot的性能,因为我必须上传大量数据

vatpfxk5  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(173)

下面是使用了2个for循环的代码。我不想使用嵌套的for循环,有没有其他替代方法?你能用替代解决方案重写代码吗?使用并行流API或任何其他解决方案来提高Java Springboot的性能,因为我必须上传大量数据,上传和释放数据需要很长时间。

for (MainTable tableElement : petmaintableObj) {
    for (String keyword : PETKeylist) {
        if (tableElement.getProdDesc().toLowerCase().contains(keyword)) {
        System.out.println(tableElement.getProdDesc() + " contains keyword " + keyword);
        MainTableRelease mtbRel = new MainTableRelease();
        String unit = tableElement.getUnit();
        Double quantity = tableElement.getQuantity();
        mtbRel.setQuantityMts(quantity);
        if (unit.equalsIgnoreCase("KGS") || unit.equalsIgnoreCase("NOS") ||        unit.equalsIgnoreCase("PCS")) {
                Double quantity_mts= quantity/1000;
                mtbRel.setQuantityMts(quantity_mts);
        }
        tableElement.setMainTableRelease(mtbRel);
        tableElement.setReportName(State.POLYESTERPET.getValue());
        tableElement.setDivision("PET");
        mainTableRepo.save(tableElement);
        break;
        }
        }
    }
}

我试过了,但似乎不太对。

List<List<String>> tableElement = petmaintableObj.stream().map(list -> list.stream()
.flatMap(string -> Arrays.stream(string.split(" ")))
.collect(Collectors.toList()))
.collect(Collectors.toList());
for (String keyword : PETKeylist) {
    if (tableElement.getProdDesc().toLowerCase().contains(keyword)) {
    System.out.println(tableElement.getProdDesc() + " contains keyword " + keyword);
    MainTableRelease mtbRel = new MainTableRelease();
    String unit = tableElement.getUnit();
    Double quantity = tableElement.getQuantity();
    mtbRel.setQuantityMts(quantity);
    if (unit.equalsIgnoreCase("KGS") || unit.equalsIgnoreCase("NOS") ||     unit.equalsIgnoreCase("PCS")) {
            Double quantity_mts= quantity/1000;
    mtbRel.setQuantityMts(quantity_mts);
    }
    tableElement1.setMainTableRelease(mtbRel);
    tableElement1.setReportName(State.POLYESTERPET.getValue());
    tableElement1.setDivision("PET");
    mainTableRepo.save(tableElement1);
    break;
}

}

dsekswqp

dsekswqp1#

不幸的是,我无法真正测试我编写的代码,因为其他对象的信息根本不够,但这应该可以做到:
1.您可以使用流API中的.filter(...),只将与Predicate<?>匹配的值保留在其中,而不必创建不必要的if块;这里我创建了一个由PETKeylist元素组成的辅助流,它与prodDesc匹配,然后返回一个布尔值。
如果为true:则项目保留在流中,否则为wise:不是的。
1.第二部分,负责printing部分,和你在if块里做的差不多,它得到关键字,并把它加到语句里。
1.第三部分也可以包含在第二部分(.peek(...))中,但为了可读性起见,我将它们分开了--它只是迭代所有元素,并执行您在if块中正在执行的操作。
1.最后但并非最不重要的是,在最后一部分,每个项目都被保存。

petmaintableObj.stream()
        .filter(tableElement -> PETKeylist.stream()
                .anyMatch(keyword -> tableElement.getProdDesc().toLowerCase().contains(keyword)))
        .peek(tableElement -> {
            String keyword = PETKeylist.stream()
                    .filter(keyword -> tableElement.getProdDesc().toLowerCase().contains(keyword))
                    .findFirst().orElse("");

            System.out.println(tableElement.getProdDesc() + " contains keyword " + keyword);
        })
        .peek(tableElement -> {
            String unit = tableElement.getUnit();
            Double quantity = tableElement.getQuantity();

            MainTableRelease mtbRel = new MainTableRelease();
            mtbRel.setQuantityMts(quantity);

            if (unit.equalsIgnoreCase("KGS") || unit.equalsIgnoreCase("NOS") || unit.equalsIgnoreCase("PCS")) {
                Double quantity_mts = quantity / 1000;
                mtbRel.setQuantityMts(quantity_mts);
            }

            tableElement.setMainTableRelease(mtbRel);
            tableElement.setReportName(State.POLYESTERPET.getValue());
            tableElement.setDivision("PET");
        }).forEach(mainTableRepo::save);

我真的希望这能起作用并解决您的问题!如果某个东西没有正常工作,请随时发送反馈。
关于表演部分:实际上,情况恰恰相反--流有时候比for循环慢。

相关问题