Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中可能为空值的CharSequence和String对象之间的相等性检查_Java - Fatal编程技术网

java中可能为空值的CharSequence和String对象之间的相等性检查

java中可能为空值的CharSequence和String对象之间的相等性检查,java,Java,我有一个CharSequence对象和一个String对象。我想比较这两种方法是否对可能为空值的相等性检查用例不敏感。我使用了嵌套的if语句,它不是那么干净和优化。问题是我不能在空CharSequence对象上调用toString。如何实现相等性检查?不会有太复杂的代码,也不会有嵌套的if。下面应该做些什么 if(Objects.equals(charSeq,str) || (charSeq !=null && str !=null && charSeq.toSt

我有一个CharSequence对象和一个String对象。我想比较这两种方法是否对可能为空值的相等性检查用例不敏感。我使用了嵌套的if语句,它不是那么干净和优化。问题是我不能在空CharSequence对象上调用toString。如何实现相等性检查?

不会有太复杂的代码,也不会有嵌套的if。下面应该做些什么

if(Objects.equals(charSeq,str) || (charSeq !=null && str !=null && charSeq.toString().equalsIgnoreCase(str))) {
   // todo
}

不会有太复杂的代码,也不会有嵌套的if。下面应该做些什么

if(Objects.equals(charSeq,str) || (charSeq !=null && str !=null && charSeq.toString().equalsIgnoreCase(str))) {
   // todo
}
直接使用equals将不起作用,因为CharSequence的equals子类之间不可互操作。 您可以使用toString方法作为CharSequence子类之间的桥梁,因为它在某些情况下(例如String和StringBuilder)是可互操作的,但并非在所有情况下都是如此

例如,在CharBuffer对象上调用toString可能会给出一个特定的结果,因为CharBuffer.toString依赖于缓冲区的当前位置

为了获得一致的结果,我认为您没有其他选择,首先检查传递的对象的类型,然后执行比较:使用toString作为StringBuilder/StringBuffer的桥,并以不同的方式处理其他类型

对于桥比较,假设您只期望StringBuilder或String作为子类:

public boolean compareContent(CharSequence charSequence, String string) {
  if (!(charSequence instanceof StringBuilder || charSequence instanceof String){
      // Exception, logging, more customized comparison or return false
  }
  return charSequence.toString().equalsIgnoreCase(string));
}
直接使用equals将不起作用,因为CharSequence的equals子类之间不可互操作。 您可以使用toString方法作为CharSequence子类之间的桥梁,因为它在某些情况下(例如String和StringBuilder)是可互操作的,但并非在所有情况下都是如此

例如,在CharBuffer对象上调用toString可能会给出一个特定的结果,因为CharBuffer.toString依赖于缓冲区的当前位置

为了获得一致的结果,我认为您没有其他选择,首先检查传递的对象的类型,然后执行比较:使用toString作为StringBuilder/StringBuffer的桥,并以不同的方式处理其他类型

对于桥比较,假设您只期望StringBuilder或String作为子类:

public boolean compareContent(CharSequence charSequence, String string) {
  if (!(charSequence instanceof StringBuilder || charSequence instanceof String){
      // Exception, logging, more customized comparison or return false
  }
  return charSequence.toString().equalsIgnoreCase(string));
}

据我了解,你的问题是: 你有两个物体,你想看看它们是否相等

我们想做的是使用。这正是你想要的。 如果CharSequence对象不为null,这很容易,因为返回的字符串具有完全相同的字符,顺序也完全相同

charSequence.toString().equalsIgnoreCase(otherString);
不幸的是,这不起作用。如果charsequence为null,则会引发NullPointerException。所以我们需要看看charsequence是否为null,然后从那里开始

public boolean compareCSAndString(CharSequence cs, String string) {
  if(cs == null) {
    // If both are null, then they're equal
    return string == null; 
  }
  else {
    return cs.toString().equalsIgnoreCase(string);
  }
}
这将勾选所有框:

它不区分大小写 它处理空值 它干净且易于阅读,无嵌套ifs
据我了解,你的问题是: 你有两个物体,你想看看它们是否相等

我们想做的是使用。这正是你想要的。 如果CharSequence对象不为null,这很容易,因为返回的字符串具有完全相同的字符,顺序也完全相同

charSequence.toString().equalsIgnoreCase(otherString);
不幸的是,这不起作用。如果charsequence为null,则会引发NullPointerException。所以我们需要看看charsequence是否为null,然后从那里开始

public boolean compareCSAndString(CharSequence cs, String string) {
  if(cs == null) {
    // If both are null, then they're equal
    return string == null; 
  }
  else {
    return cs.toString().equalsIgnoreCase(string);
  }
}
这将勾选所有框:

它不区分大小写 它处理空值 它干净且易于阅读,无嵌套ifs charSeq==str处理两个都为null时的情况只有在这种情况下,因为它们属于不同的类,无法识别相同的对象引用


charSeq==str处理两个都为null时的情况仅此情况,因为它们属于不同的类,无法识别相同的对象引用

如果charSeq为null,str不为null怎么办?这不包括OP请求:不区分大小写的检查@XoXo然后它们不相等,你可以控制else语句。很好,但是使用equalsIgnoreCase使你的答案更正确。所以,我做了一个小时的研究,发现equalsIgnoreCase方法解决了这个问题;如果charSeq为null,str不为null怎么办?这不包括OP请求:不区分大小写的检查@XoXo然后它们不相等,你可以控制else语句。很好,但是使用equalsIgnoreCase使你的答案更正确。所以,我做了一个小时的研究,发现equalsIgnoreCase方法解决了这个问题;如果两者都为空呢?它们应该被视为相等吗?是@DanielePantaleone如果两者都为空呢?它们应该被视为相等吗?是的@DanielPantaleOne您可以简化为公共布尔比较和StringCharSequence cs,字符串字符串{return cs!=null?cs.toString.equalsIgnoreCasestring:false;}那么简单吗?我知道它很短,但对我来说每次都更容易阅读。我想这是风格的问题。你可以简化为公共布尔比较器和StringCharSequence cs,String
{return cs!=null?cs.toString.equalsIgnoreCasestring:false;}这更简单吗?我知道它很短,但对我来说每次都更容易阅读。我想这是风格的问题。