如何删除此java代码中的代码重复

问题描述

在 2 个不同的方法中使用相同的 for-each 循环,有没有办法减少代码重复?

一个代码

for (AjaxControlBean controlBean : requestData.getControls()) {
    if (StringUtils.isAnyBlank(controlBean.getId(),controlBean.getName()) || "repeat".equalsIgnoreCase(controlBean.getType())) 
    {
        continue;
    }
    FormInstanceControl control = formInstance.getControl(controlBean.getId());
    if (control == null) {
       control = new FormInstanceControl();
       control.setFormInstance(formInstance);
       control.setControlId(controlBean.getId());
       formInstance.putControl(control);
    }
    if (controlBean.getValues() != null) {
       if (control.getData() != null)
          control.getData().clear();
       else
          control.setData(new ArrayList<FormInstanceData>());

       for (String value : controlBean.getValues()) {
           FormInstanceData data = new FormInstanceData();
           data.setControl(control);
           data.setType(FormInstanceData.TYPE_TEXT);
           data.setText(value);
           control.getData().add(data);
       }
    }
}

第二个代码

for (AjaxControlBean controlBean : requestData.getControls()) {
     if (StringUtils.isAnyBlank(controlBean.getId(),controlBean.getName()) || "repeat".equalsIgnoreCase(controlBean.getType())) {
         continue;
     }
     FormInstanceControl control = formInstance.getControl(controlBean.getId());
     if (control == null) {
        control = new FormInstanceControl();
        control.setFormInstance(formInstance);
        control.setControlId(controlBean.getId());
        formInstance.putControl(control);
     }
     if (controlBean.getValues() != null) {
        if (control.getData() != null) {
            control.getData().clear();
        } 
        else 
        {
            control.setData(new ArrayList<FormInstanceData>());
        }
        int i = 0;
        for (String value : controlBean.getValues()) {
            FormInstanceData data = new FormInstanceData();
            data.setControl(control);
            data.setType(FormInstanceData.TYPE_TEXT);
            data.setText(value);
            data.setIdx(i++);
            control.getData().add(data);
        }
    }
}

它唯一的区别是 data.setIdx(i++);如果我能做些什么来减少行数,请告诉我

解决方法

您可以分解出一个以 FormInstanceControlAjaxControlBean 作为参数的方法。然后你就得到了你需要的一切:

private void addBeanData( FormInstanceControl control,AjaxControlBean controlBean) {
    int i = 0;
    for (String value : controlBean.getValues()) {
        FormInstanceData data = new FormInstanceData();
        data.setControl(control);
        data.setType(FormInstanceData.TYPE_TEXT);
        data.setText(value);
        data.setIdx(i++);
        control.getData().add(data);
     }
}

这假设,如果设置了 Idx,第一个代码段不会中断,即使它没有在原始代码中完成。

用法:在使用 for 循环之前,只需执行 addBeanData( control,controlBean );