改善自定义比较器代码质量

时间:2016-12-26 23:35:01

标签: java software-quality

更好的方法来编写这个比较器?

Comparator<JSONObject> comparator = (op1,op2) -> {
         Integer id1 = Integer.valueOf(String.valueOf(op1.get(field)));
         Integer id2 = Integer.valueOf(String.valueOf(op2.get(field)));
         return id2.compareTo(id1);
         };

是否可以避免两个valueOf

2 个答案:

答案 0 :(得分:2)

使用Comparator.comparingInt

您应该能够执行以下操作:

Comparator<JSONObject> comparator = 
    Comparator.comparingInt(obj -> Integer.valueOf(String.valueOf(obj.get(field))))
    .reversed();

getInt

检查JSONObject的API以查看是否有getInt方法或类似方法,然后您应该可以直接使用它而不是包含在valueOf个调用中,如:

Comparator<JSONObject> comparator = Comparator.<JSONObject>comparingInt(obj -> obj.getInt(field))
    .reversed();

返回类型.get

或者,您应该调查obj.get(field)返回的类型。如果你很幸运,它可以像一个类型一样简单:

Comparator<JSONObject> comparator = 
    Comparator.<JSONObject>comparingInt(obj -> (Integer) obj.get(field))
    .reversed();

返回类型为String

如果您Strings的结果总是obj.get,那么您应该可以直接使用Integer.valueOf,而不是调用String.valueOf

Comparator<JSONObject> comparator = 
    Comparator.<JSONObject>comparingInt(obj -> Integer.valueOf(obj.get(field)))
    .reversed();

根据API的不同,您仍可能需要对String

进行类型转换
Comparator<JSONObject> comparator = 
    Comparator.<JSONObject>comparingInt(obj -> Integer.valueOf((String) obj.get(field)))
    .reversed();

答案 1 :(得分:-1)

  

是否可以避免两个valueOf?

这取决于是否知道您想要获得的field类型,即:它是int还是string还是

如果是保证int,您可以简单地执行此操作

Comparator<JSONObject> comparator = (op1,op2) -> {
     return Integer.valueOf(op1.get(field)).compareTo(Integer.valueOf(op2.get(field));
};

升序

如果值为string,则可以执行此操作

Comparator<JSONObject> comparator = (op1,op2) -> {
     return Integer.parseInt((String)op1.get(field)) - Integer.parseInt((String)op2.get(field));
};