【问题标题】:Improve custom comparator code quality提高自定义比较器代码质量
【发布时间】:2016-12-26 23:35:00
【问题描述】:

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

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

【问题讨论】:

标签: java software-quality


【解决方案1】:

使用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

如果您总是从obj.get 得到Strings,那么您应该可以直接使用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();

【讨论】:

  • 不明白。 obj 是 op1 还是 op2?
  • @user3727540 两者都没有,Comparator.comparing 提供了一种方法来指定应该在对象上比较哪个 field/value,然后它将为两个字段提取该值。最后对.reversed() 的调用是因为在您的原始代码中您使用id2.compareTo(id1) 而不是id1.compareTo(id2)
  • JSOObject 只有一个方法 get 返回一个 Object。
  • @user3727540 JSONObject 来自哪个
  • @user3727540:假设你的意思是Android的org.json.JSONObject,它有一个getInt()方法。
【解决方案2】:

是否可以避免两个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));
};

【讨论】:

猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2017-11-02
  • 2016-10-20
  • 2018-12-22
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多