今天遇到了一个非常老的接口,返回值是一个数组,下游把成员变量赋值成了String[]数组返回给我们,奇坑无比。
按照道理其实应该让他们改返回值的,但是下游坚决不改。无奈只有我们自己适配对象。
例:
下游返回 {“张三”,,“18”,“男”,“180cm”,“75KG”}
我们需要转换成对象User
@Data
public class User {
private String name;
private String age;
private String sex;
private String height;
private String weight;
}
正常转换策略应该是
public static User convertUser(String[] arr){
User user = new User();
user.setName(arr[0]);
user.setAge(arr[1]);
user.setSex(arr[2]);
user.setHeight(arr[3]);
user.setWeight(arr[4]);
return user;
}
但是坑就坑在下游返回的数据可能是{“张三”,,“18”,“男”,“180cm”,“75KG”}
也可能是{“张三”,,“18”,“男”,“180cm”} 或{“张三”}
这样上面的方法就会数组越界异常了。
我们可以改写我们的方法
通过主动感知异常来停止代码
public static User convertUser1(String[] arr){
User user = new User();
try {
user.setName(arr[0]);
user.setAge(arr[1]);
user.setSex(arr[2]);
user.setHeight(arr[3]);
user.setWeight(arr[4]);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
但是这种方式不是一种优雅的处理机制。
所以有了下面的方法
public static User convertUser2(String[] arr){
User user = new User();
Map<Integer, BiConsumer<User,String>> consumerMap= new HashMap<>();
consumerMap.put(0,User::setName);
consumerMap.put(1,User::setAge);
consumerMap.put(2,User::setSex);
consumerMap.put(3,User::setHeight);
consumerMap.put(4,User::setWeight);
for (int i = 0; i < arr.length; i++) {
consumerMap.get(i).accept(user,arr[i]);
}
return user;
}
通过BiConsumer 解决越界异常处理。
完整demo
@Data
public class User {
private String name;
private String age;
private String sex;
private String height;
private String weight;
public static User convertUser(String[] arr){
User user = new User();
user.setName(arr[0]);
user.setAge(arr[1]);
user.setSex(arr[2]);
user.setHeight(arr[3]);
user.setWeight(arr[4]);
return user;
}
public static User convertUser1(String[] arr){
User user = new User();
try {
user.setName(arr[0]);
user.setAge(arr[1]);
user.setSex(arr[2]);
user.setHeight(arr[3]);
user.setWeight(arr[4]);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
public static User convertUser2(String[] arr){
User user = new User();
Map<Integer, BiConsumer<User,String>> consumerMap= new HashMap<>();
consumerMap.put(0,User::setName);
consumerMap.put(1,User::setAge);
consumerMap.put(2,User::setSex);
consumerMap.put(3,User::setHeight);
consumerMap.put(4,User::setWeight);
for (int i = 0; i < arr.length; i++) {
consumerMap.get(i).accept(user,arr[i]);
}
return user;
}
public static void main(String[] args) {
User user = User.convertUser2(new String[]{"张三", "18"});
System.out.println(user);
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
", height='" + height + '\'' +
", weight='" + weight + '\'' +
'}';
}
}