java - 使用流从一个列表到另一个列表中查找代码
问题描述
我有一个响应对象,每个对象有 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;
}
但那里只有第一项。我搞不清楚了。任何帮助表示赞赏。
解决方案
您可以从这里开始重写内部代码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));
});
推荐阅读
- java - 如何获取根据 JAVA 中的用户选择而变化的 JsonObjects?
- angular - 如何使用 DeckGL 在谷歌地图上显示 30k 多段线
- javascript - IBM Watson Assistant 聊天机器人中的“$.post 不是函数”
- javascript - 无法循环遍历数组并吐出 API 结果
- javascript - javascript 文件中的函数无法使用声明文件检测自己的类型
- java - 有没有办法将来自 Scanner 对象的用户输入存储在数组列表中,而无需事先确定数组大小?
- java - 如何在设置 Seekbar 的最小值和最大值而不是传递 int 时传递 DP 值?
- chaos - 在本地启动 chaosblade-box 时出错
- cgal - 基于CGAL的电路板布线算法
- c - 如何检查一个进程是否已经完成?