使用流从一个列表查找代码到另一个列表

问题描述

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

在响应对象中,我正在遍历8个json字符串。

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

查找响应类

@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,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;

}

,但其中只有第一项。我迷路了。任何帮助表示赞赏。

解决方法

您可以从以下位置开始在else中重写代码:

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

此for可以用流替换以找到匹配的第一个元素:

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));  
});