以优雅的方式检查两个参数是否为 null

Check two arguments for null in an elegant way

我正在迭代两个集合并检查两个集合是否包含 相同的元素。我无法使用 Java 8.


编辑 1 年后:

我创建了问题中的方法来检查两个集合是否包含相同的元素,而没有考虑我将两个 Collection 实现传递给方法的事实。

但是 Collection 并不能确定元素是如何排序的。我正在迭代这些集合。因此,Collection 的某些实现可以随机顺序保存元素,同时包含相同的元素。


两个集合都包含 元素 具有可比性 和内容 定义为相等,如果所有元素 return a x.compareTo(y) 和 0.

两个值定义为不同,如果其中一个为空,而另一个不为空。 我想找到一种优雅的方式来比较无效性并防止 对最终 compareTo().

进行空检查

我当前的实现:

    public static <T extends Comparable<T>> boolean isSame(@Nullable Collection<T> a, @Nullable Collection<T> b) {

    if (a == null || b == null) {
        return (a == null && b == null);
    }

    if (a.size() != b.size()) {
        return false;
    }
    Iterator<T> aIt = a.iterator();
    Iterator<T> bIt = b.iterator();
    while (aIt.hasNext()) {
        T aValue = aIt.next();
        T bValue = bIt.next();
        if (aValue == null || bValue == null) {
            if (aValue == null ^ bValue == null) {
                return false;
            }
            //both null, don't compare, continue looping...
        } else if (aValue.compareTo(bValue) != 0) {
            return false;
        }
    }
    return true;
}

如果两个值都为空,我想继续 while 循环,因为那是 定义为相等。

但我正在为这部分而苦苦挣扎:

if (aValue == null || bValue == null) {
        if (aValue == null ^ bValue == null) {
            return false;
        }
}

问题:

是否有更优雅和可读的方式来比较空值,如果两者都不为空则进一步比较,return如果只有一个为空则为假,并继续循环,如果两个值都为空?

下面的顺序应该可以正常工作:

if(aValue == null && bValue == null) continue; // both null; continue
if(aValue == null || bValue == null) return false; // any null; return false
if(aValue.compareTo(bValue) != 0) { // both non-null; compare
    return false;
}

在 Java8 中,您可以构建一个 Comparator 以创建额外对象为代价来替换比较序列(您需要决定是否关心它):

Comparator<T> cmp = Comparator.nullsLast(Comparator.naturalOrder());

compararor 将为您进行空值比较(因为您假设两个 null 相等):

while (aIt.hasNext()) {
    T aValue = aIt.next();
    T bValue = bIt.next();
    if (cmp.compare(aValue, bValue) != 0) {
      return false;
    }
}