Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check two arguments for null in an elegant way

I am iterating over two collections and check if both collections contain the same elements. I can't use Java 8.


edit 1 year after:

I created the method in the question to check if two Collections contain the same elements, without thinking about the fact that I am passing two Collection implementations into the method.

But Collection does not determine how elements are sorted. And I am iterating over the collections. Thus, some implementation of Collection could save elements in random order, while containing the same elements.


Both collections contain elements that are comparable and the content is defined as equal, if all elements return a x.compareTo(y) with 0.

Two values are defined as different, if one of them is null, but not the other. I want to find an elegant way to compare on nullity and prevent a null check on the final compareTo().

My current implementation:

    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;
}

I want to continue the while loop, if both values are null, because that is defined as equal.

But I am struggling with this part:

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

Question:

Is there a more elegant and readable way to compare on nullity, do a further compare if both are not null, return false if only one is null, and continue the loop, if both values are null?

like image 364
JacksOnF1re Avatar asked Aug 28 '17 10:08

JacksOnF1re


People also ask

How to check if something is null?

Typically, you'll check for null using the triple equality operator ( === or !== ), also known as the strict equality operator, to be sure that the value in question is definitely not null: object !== null . That code checks that the variable object does not have the value null .

How do you compare null values in if condition?

Use the ISNULL function with the IF statement when you want to test whether the value of a variable is the null value. This is the only way to test for the null value since null cannot be equal to any value, including itself. The syntax is: IF ISNULL ( expression ) ...

How do I avoid multiple nulls in Java 8?

We can get rid of all those null checks by utilizing the Java 8 Optional type. The method map accepts a lambda expression of type Function and automatically wraps each function result into an Optional . That enables us to pipe multiple map operations in a row. Null checks are automatically handled under the hood.


1 Answers

The sequence as follows should work well:

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;
}
like image 187
Naman Avatar answered Sep 30 '22 06:09

Naman