Exercise 5 - Maybe
What is Maybe<T>
Counter c = bank.findCounter();Main methods explanation
1
// Return the wrapped value
// Or Maybe.NONE if
// 1. It is invoked from Maybe.NONE
protected abstract T get();@Override
protected Object get() {
throw new NoSuchElementException();
}@Override
protected T get() {
return this.content;
}2
// Returns Maybe.none() if
// 1. it is invoked from Maybe.NONE
// 2. the content is null
// 3. the content didn't pass the test
// Otherwise, return the Maybe(Wrapper) itself
public abstract Maybe<T> filter(BooleanCondition<? super T> c);@Override
public Maybe<Object> filter(BooleanCondition<? super Object> c) {
return Maybe.none();
} @Override
public Maybe<T> filter(BooleanCondition<? super T> c) {
if (this.content != null && !c.test(this.content)) {
return Maybe.none();
}
return this;
}3
// Return Maybe.none() if
// 1. It is invoked from Maybe.NONE
// Otherwise, return the wrapper of the value after transformation
public abstract <U> Maybe<U> map(Transformer<? super T, ? extends U> t);@Override
public <U> Maybe<U> map(Transformer<? super Object, ? extends U> t) {
return Maybe.none();
}@Override
public <U> Maybe<U> map(Transformer<? super T, ? extends U> t) {
return Maybe.some(t.transform(this.content));
}4
// Return Maybe.none() if
// 1. it is invoked from Maybe.NONE
// Otherwise, return value after transformation (in this case we explicitly specify it as a Wrapper)
public abstract <U> Maybe<U> flatMap(Transformer<? super T, ? extends Maybe<? extends U>> t);@Override
public <U> Maybe<U> flatMap(Transformer<? super Object, ? extends Maybe<? extends U>> t) {
return Maybe.none();
} @Override
public <U> Maybe<U> flatMap(Transformer<? super T, ? extends Maybe<? extends U>> t) {
@SuppressWarnings("unchecked")
Maybe<U> m = (Maybe<U>) t.transform(this.content);
return m;
}5
// Return the alternative value t provided as parameter, if
// 1. it is invoked from Maybe.NONE
// Otherwise, return the content that is in the Wrapper
public abstract T orElse(T t);@Override
public Object orElse(Object o) {
return o;
}@Override
public T orElse(T t) {
return this.content;
}6
// Return the value produced by calling produce() on the provided Producer, if
// 1. It is invoked from Maybe.NONE
// Otherwise, return the content that is in the Wrapper
public abstract T orElseGet(Producer<? extends T> p);@Override
public Object orElseGet(Producer<? extends Object> p) {
return p.produce();
}@Override
public T orElseGet(Producer<? extends T> p) {
return this.content;
}7
// Do nothing and return, if
// 1. it is invoked from Maybe.NONE
// Otherwise, do something by executing the consumer's consume() method with the content as argument
public abstract void ifPresent(Consumer<? super T> c);@Override
public void ifPresent(Consumer<? super Object> c) {
return;
}@Override
public void ifPresent(Consumer<? super T> c) {
c.consume(this.content);
}8
// Factory method used to create a Maybe(Wrapper)
public static <T> Maybe<T> of(T t) {
if (t == null) {
return Maybe.none();
}
return Maybe.some(t);
}public static <T> Maybe<T> none() {
@SuppressWarnings("unchecked")
Maybe<T> none = (Maybe<T>) NONE;
return none;
}public static <T> Maybe<T> some(T t) {
return new Some<T>(t);
}Single return statement
Tips
Last updated