I have written an Optional type in groovy roughly based on java8s Optional
. I implemented and use a fold method and would like to know if it can be improved. First, here comes the Optional
(I will only use its fold
method for my question though):
class Optional<T> {
T value
private Opional(T value) {
this.value = value
}
final Boolean isPresent() {
value != null
}
final Object map(Closure mapper) {
mapper(value).with { Object result ->
if (result != null)
return new Optional(result)
else
return new Optional(null)
}
}
final Object flatMap(Closure mapper) {
if( ! this.isPresent)
return Optional.empty()
else
return this.map(mapper)
}
public Object fold(Closure ifEmpty, Closure f) {
if(isPresent())
return ifEmpty.call()
else
return f.call(value)
}
final static Optional<T> of(T value) {
if(value == null)
throw new IllegalArgumentException("Argument for Optional.of() must not be null")
new Optional<T>(value)
}
final static Optional<T> empty() {
new Optional(null)
}
}
(I ommitted some methods like orElse
and others)
Next, there are maybe two result-variables. They are therefore of type Optional
. I want to execute an action if at least one of the result variables is present AND successfull. I do it like that:
if( resultA.fold({false}, {it.isSuccess()}) || resultB.fold({false}, {it.isSuccess()}) ) {
//execute action
}
Is it a good way to use fold here or should I just stay with:
(resultA.isPresent() && resultA.isSuccess())
Also, can/could this usage of fold be improved or are there other ways to work it out?