【发布时间】:2020-08-19 23:46:46
【问题描述】:
我有两个字符串列表,想要比较列表中的值并构造另一个对象的新列表。我可以使用嵌套循环来做到这一点,但正在寻找更高效、更整洁的解决方案。
List<String> list1 = new ArrayList();
list1.add("A,Airplane");
list1.add("B,Boat");
List<String> list2 = new ArrayList();
list2.add("A90, Boing Airplane");
list2.add("A70, Boing777");
list2.add("B80, Boing Boat");
有一个 Vehicle 对象。
class Vehicle {
private String model;
private String submodel;
private String type;
private String subtype;
// setters getters
}
现在,我需要通过将模型(list1 中的第一个字符)与 list2 中的第一个字符匹配来构建车辆对象,并构建类似这样的东西
private List<Vehicle> buildVehicle(List<String> list1, List<String> list2) {
List<Vehicle> vehicles = new ArrayList<>();
if (ObjectUtils.isNotEmpty(list2)) {
list2.forEach(v -> {
Vehicle vehicle = new Vehicle();
if (v.contains(",")) {
String[] val = StringUtils.split(v,",");
vehicle.setSubtype(val[0]);
vehicle.setSubmodel(val[1]);
}
for (String c : list1) {
//Matching the first character from element in list1
if (c.substring(0,1).equals(vehicle.getSubtype().substring(0,1))
&& c.contains(",")) {
String[] val = StringUtils.split(c, ",");
vehicle.setType(val[0]);
vehicle.setModel(val[1]);
}
break;
}
}
vehicles.add(vehicle);
});
}
return vehicles;
}
使用流可以避免嵌套循环吗?
【问题讨论】:
-
请注意,您可能可以获得更紧凑、更易读和更整洁的解决方案,但很可能不是您提到的更“高性能”的解决方案。性能主要取决于您使用的数据结构以及解决方案的时间/空间复杂性。最重要的是,流 api 没有优化,因此比旧的 for/while 循环稍慢。
-
你能解释一下紧凑、更整洁的解决方案吗?
-
ObjectUtils和StringUtils不是 JDK 的一部分。
标签: java java-stream