簡體   English   中英

jsf中ArrayList的奇怪行為

[英]Strange behaviour of ArrayList in jsf

我正在使用jsf開發Web應用程序。 我嘗試在ArrayList“ materialsSummaryBean.electrolyserMaterialLotList”中使用索引0的元素顯示屬性“ brandName”,並使用“ c:forEach”為所有元素顯示此屬性。

            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            #{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
            <br/>
            <hr/>

            <c:forEach
                    items="#{materialsSummaryBean.electrolyserMaterialLotList}"
                    var="item" varStatus="loop">
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        #{item.material.material.brandName}
                        <br/>
                        <hr/>
                </c:forEach>

結果,我絕對將索引為0的元素的值列表隨機化:

ШБ-5 
ЗШБ класс 4 
МШ-39 
ЗШБ класс 4 
МШ-39 
КПД-400И 
ШБ-5 
МШ-39 

對於列表中的所有元素:

                        ЗШБ класс 4
                        ЗШБ класс 4
                        КПД-400И
                        ЗШБ класс 4
                        ШБ-5
                        МШ-39
                        ЗШБ класс 4

                        <hr />

                        ЗШБ класс 4
                        ЗШБ класс 4
                        МШ-39
                        КПД-400И
                        ЗШБ класс 4
                        ШБ-5
                        МШ-39

                        <hr />

                        МШ-39
                        КПД-400И
                        ЗШБ класс 4
                        КПД-400И
                        ЗШБ класс 4
                        ШБ-5
                        МШ-39

                        <hr />

                        ШБ-5
                        ЗШБ класс 4
                        МШ-39
                        МШ-39
                        ШБ-5
                        КПД-400И
                        МШ-39

                        <hr />

而且我不知道這是什么,什么是問題。

MaterialsSummaryBean方法“ getElectrolyserMaterialLotList”:

public List<MaterialLotSummaryData> getElectrolyserMaterialLotList() {
    MaterialLotFilter materialLotFilter = new MaterialLotFilter();
    materialLotFilter.setElectrolyserId(id);
    return materialService.getMaterialLotByElectrolyserId(materialLotFilter);
}

和“ getMaterialLotByElectrolyserId”方法:

public List<MaterialLotSummaryData> getMaterialLotByElectrolyserId(MaterialLotFilter materialLotFilter) {
    Long electrolyserId = materialLotFilter.getElectrolyserId();
    if (electrolyserId == null) {
        throw new IllegalArgumentException("Electrolyser id cannot be null.");
    }

    TypedQuery<Unit> queryUnit = em.createQuery(
            "select u from Unit u where u.electrolyser.id = :selectedElectrolyser", 
            Unit.class)
            .setParameter("selectedElectrolyser", electrolyserId);


    List<Unit> unitList = queryUnit.getResultList();
    HashSet<MaterialLot> materialLotList = new HashSet<MaterialLot>();

    HashMap<Long, Double> materialLotUsageMap = new HashMap<Long, Double>();

    for (Unit unit : unitList) {
        MaterialLot currentMaterialLot = unit.getMaterialLot();

        if (currentMaterialLot == null) continue;

        materialLotList.add(currentMaterialLot);


        Double usage = unit.getActualMaterial().getAmount();
        if (!materialLotUsageMap.containsKey(currentMaterialLot.getId())) {
            materialLotUsageMap.put(currentMaterialLot.getId(), (usage == null) ? 0 : usage);
        } else {
            if(usage == null) continue;
            Double currentUsage = materialLotUsageMap.get(currentMaterialLot.getId());
            materialLotUsageMap.put(currentMaterialLot.getId(), currentUsage + usage);
        }
    }

    List<MaterialLotData> result = mapper.createList(materialLotList, MaterialLotData.class);

    MaterialLotSummaryData summaryData;
    ArrayList<MaterialLotSummaryData> summaries = new ArrayList<MaterialLotSummaryData>();
    for (MaterialLotData materialLot : result) {
        if (materialLotUsageMap.containsKey(materialLot.getId())) {
            summaryData = new MaterialLotSummaryData();
            summaryData.setId(materialLot.getId());
            summaryData.setAcceptanceDate(materialLot.getAcceptanceDate());
            summaryData.setLotNumber(materialLot.getLotNumber());
            summaryData.setMaterial(materialLot.getActualMaterial());
            summaryData.setNumber(materialLot.getNumber());
            summaryData.setManufacturer(materialLot.getManufacturer());

            Double usage = materialLotUsageMap.get(materialLot.getId());
            summaryData.setUsage(usage);
            summaries.add(summaryData);

            materialLotUsageMap.remove(materialLot.getId());
        }
    }

    return summaries;
}

服務方法被稱為electrolyserMaterialLotList每次訪問,以及通過訪問數據庫並再次執行相同操作而准備的列表,即使對於單項訪問也是如此。 您應該避免這樣做。 基本上,您可以在getter方法中使用null檢查。

public List<MaterialLotSummaryData> getElectrolyserMaterialLotList() {
    if(electrolyserMaterialLotList == null)
    {
          MaterialLotFilter materialLotFilter = new MaterialLotFilter();
          materialLotFilter.setElectrolyserId(id);
         electrolyserMaterialLotList  = materialService.getMaterialLotByElectrolyserId(materialLotFilter);
    }
     return electrolyserMaterialLotList;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM