首页 > 解决方案 > 使用流从一个列表到另一个列表中查找代码

问题描述

我有一个响应对象,每个对象有 8 个 json 字符串。每个都有一个带有代码的外部颜色,我需要相互匹配。我的代码使用两个 for 循环。我想使用流并提高效率。我似乎无法弄清楚。

在响应对象中有 8 个我正在循环的 json 字符串。

在我的合并方法中,我传入了一个空列表和一个查找响应对象以及在车辆数组中找到的样式 ID。我要做的第一件事是将第一个临时列表分配给我作为第一个参数传入的空列表。最终,我使用第一个初始列表来匹配exteriorColors.code,如果它们匹配,我将styleid 添加到exteriorcolors 中的样式数组中。如果找不到,我将整个颜色对象添加到初始列表并继续检查。

查找响应类

@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class LookupResponse implements Serializable {

private static final long serialVersionUID = 1079274125000921996L;

private List<VehicleInfo> vehicles;
private List<Packages> packages;
private List<TechSpecs> techSpecs;
private List<Features> features;
private List<Color> exteriorColors;
private List<Color> interiorColors;
private List<OptionsMSRP> options;

}

    for(int i = 0; i < cResponse.getResult().size(); i++){
        String val = cResponse.getResult().get(i).get(VEH_SUMMARY_RESPONSE);
        temp = mapper.readValue(val, LookupResponse.class);
        vehicles.add(temp.getVehicles().get(0));
      exteriorColors = mergeColors(exteriorColors, temp.getExteriorColors(), temp.getVehicles().get(0).getStyleId());

}


 private List<Color> mergeColors(List<Color> mergeList, List<Color> lstExterior, String styleid) {

    List<String> styles =  new ArrayList<>();
    boolean isColorFound = false;

    for(int idx = 0; idx < lstExterior.size(); idx++){
        styles.clear();
        styles.add(styleid);
        lstExterior.get(idx).setStyles(styles);
        isColorFound = false;
        if(mergeList.size() == 0){
            mergeList.add(lstExterior.get(idx));

        }else{
            for(int idx2 = 0; idx2 < mergeList.size(); idx2++){
                if(mergeList.get(idx2).getCode().equalsIgnoreCase(lstExterior.get(idx).getCode())){
                    if(!mergeList.get(idx2).getStyles().contains(styleid)){
                        mergeList.get(idx2).getStyles().add(styleid);
                    }
                    isColorFound = true;
                    break;
                }
            }
            if(!isColorFound){
                mergeList.add(lstExterior.get(idx));
            }
        }
    }

    return mergeList;

}

我正在尝试使用 java 8 流/lambda 来获得相同的结果。我需要一些帮助。我尝试过但不起作用的是

 private List<Color> mergeColors(List<Color> mergeList, List<Color> lstExterior, String styleid) {

    List<String> styles =  new ArrayList<>();
    List<Color> filteredList =  new ArrayList<>();
    boolean isColorFound = false;

    for(int idx = 0; idx < lstExterior.size(); idx++){
        styles.clear();
        styles.add(styleid);
        lstExterior.get(idx).setStyles(styles);
        isColorFound = false;
        if(mergeList.size() == 0){
            mergeList.add(lstExterior.get(idx));

        }else{

            filteredList = mergeList.stream()
                    .filter(ml -> lstExterior.stream()
                            .allMatch(lst -> lst.getCode().equals(ml.getCode())))
                    .collect(Collectors.toList());

        }
    }

    return mergeList;

}

但那里只有第一项。我搞不清楚了。任何帮助表示赞赏。

标签: javajava-8java-stream

解决方案


您可以从这里开始重写内部代码else

for(int idx2 = 0; idx2 < mergeList.size(); idx2++){

这个 for 可以替换为 stream 以找到匹配的第一个元素:

String lstExteriorCode = lstExterior.get(idx).getCode();
Optional<Color> firstMatch = mergeList.stream()
  .filter(ml -> ml.getCode().equalsIgnoreCase(lstExteriorCode))
  .findFirst();

你可以做剩下firstMatch的事情(添加Styles和插入mergeList

firstMatch.ifPresent(color -> {
  if(!color.getStyles().contains(styleid)){
    color.getStyles().add(styleid);
  }
  mergeList.add(lstExterior.get(idx));  
}); 

推荐阅读