Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save thiagosperandio/5ecd661b84cd687f86487058d0e2e6f6 to your computer and use it in GitHub Desktop.
Save thiagosperandio/5ecd661b84cd687f86487058d0e2e6f6 to your computer and use it in GitHub Desktop.
Java - Usar Optional + equals() pra comparar objetos e atributos nulos

Usar Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longNull ) );

Pra galerinha da gamb, vi um (monte de) código com comparação Long == Long, o que é errado.

No caso, a pessoa queria validar se o objeto é nulo, se o atributo é nulo e então comparar com um outro valor, que também poderia ser nulo. Por fim, fizeram a comparação de obj.getId() == idObjParam, o que é muito zuero. Devem ter medo de que obj.getId().equals(idObjParam) dê um null pointer exception. Compreensível, mas não tem jeito. Temos que usar o .equals() de qualquer forma pois é uma comparação entre objetos!

O exemplo desse snippet é para mostrar como fazer isso usando um único Optional.

No caso, o equals() ali não é do próprio tipo do objeto, mas é de Optional. Sendo assim, o atributo de comparação com o equals() foi também transformado em Optional para os resultados serem mais corretos.

Testei no site https://www.jdoodle.com/online-java-compiler

O resultado foi

obj.id = null:
 obj.id == null ? true
 Optional.equals() is null ? true
 obj.id == 5000L ? false
 Optional.equals() is 5000L ? false

obj.id = 5000L:
 obj.id == null ? false
 Optional.equals() is null ? false
 obj.id == 5000L ? false
 Optional.equals() is 5000L ? true

obj = null:
 Optional.equals() is null ? true
 Optional.equals() is 5000L ? false

Segue o código:


import java.util.Optional;

public class MyClass {

	public static void main( String args[] ) {

		class Obj {
			Long id;
		}
		Long longVal = 5000L;
		Long longNull = null;

		Obj obj = new Obj();
		obj.id = null;
		System.out.println( "obj.id = null:" );
		System.out.println( " obj.id == null ? " + (obj.id == longNull) );
		System.out.println( " Optional.equals() is null ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longNull ) ) );
		System.out.println( " obj.id == 5000L ? " + (obj.id == longVal) );
		System.out.println( " Optional.equals() is 5000L ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longVal ) ) );

		obj.id = 5000L;
		System.out.println( "\nobj.id = 5000L:");
		System.out.println( " obj.id == null ? " + (obj.id == longNull) );
		System.out.println( " Optional.equals() is null ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longNull ) ) );
		System.out.println( " obj.id == 5000L ? " + (obj.id == longVal) );
		System.out.println( " Optional.equals() is 5000L ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longVal ) ) );

		obj = null;
		System.out.println( "\nobj = null:");
		System.out.println( " Optional.equals() is null ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longNull ) ) );
		System.out.println( " Optional.equals() is 5000L ? " + Optional.ofNullable( obj ).map( x -> x.id ).equals( Optional.ofNullable( longVal ) ) );
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment