以优雅的方式检查两个参数是否为 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;
}
}
我正在迭代两个集合并检查两个集合是否包含 相同的元素。我无法使用 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;
}
}