java - example - try..catch VS long if()
throw exception java (1)
Si puede refactorizar el código y hacer que cada método devuelva Optional
. Será posible evitar las comprobaciones nulas e intentar ... atrapar.
Optional<Result> result = something.getSomethingElse()
.flatMap(e -> e.getSecondSomething())
.flatMap(x -> x.getThirdSomething())
.flatMap(e -> e.getFourthSomething());
// at the end to check if result is present
result.ifPresent(..some_logic_here..); // or result.orElse(...);
entonces getSomethingElse()
devuelve Optional<SomethingElse>
, getThirdSomething()
- Optional<ThirdSomething>
y así sucesivamente. Tenemos que usar aquí flatMap(Function<? super T,Optional<U>> mapper)
porque si el asignador proporcionado es uno cuyo resultado ya es un opcional, y si se invoca, flatMap no lo envuelve con un opcional adicional. En otras palabras, si el map
en el map(e -> e.getSecondSomething())
el tipo de resultado será Optional<Optional<SecondSomething>>
y tendremos que hacer innecesario get()
call - map(...).get().map(...)
.
Espero que esto ayude.
ACTUALIZADO Puedes hacer lo mismo usando referencias de métodos.
Optional<Result> result = something.getSomethongElse()
.flatMap(SomethongElse::getSecondSomething)
.flatMap(SecondSomething::getThirdSomething)
.flatMap(ThirdSomething::getFourthSomething);
Esta pregunta ya tiene una respuesta aquí:
Tengo una estructura de modelo compleja en mi proyecto.
A veces tengo que sacarle un valor profundo . Parece que sigue:
something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
El problema es que cada uno de esos métodos podría devolver null
, y obtendré NullPointerException
en caso de que así sea.
Lo que quiero saber es si escribo mucho si me gusta
if(something != null && something.getSomethongElse() != null && something..getSomethongElse().getSecondSomething() != null && something.getSomethongElse().getSecondSomething().getThirdSomething() != null && omething.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething() != null) {
//process getFourthSomething result.
}
O está bien solo usar try..catch como sigue:
SomethingFourth fourth = null;
try {
fourth = something.getSomethongElse().getSecondSomething().getThirdSomething().getFourthSomething();
} catch (NullPointerException e) { }
if(fourth != null) {
///work with fourth
}
Sé que NPE
es algo que debe evitarse, pero ¿no es excesivo evitarlo en mi caso?