public Maybe filter(Predicate pred)
Ваш метод filter
принимает предикат raw и возвращает необработанный Maybe
.
Это означает, что он ожидает предикат, который будет работать для любого объекта, и он дает Maybe
, который может содержать любой тип объекта.
Это должно быть что-то вроде
public Maybe<T> filter(Predicate<? super T> pred) {
if (isPresent() && !pred.test(cont)) {
return new Maybe<T>();
}
return this;
}
Таким образом, он будет принимать только предикат, который работает для универсального типа T
, и возвращает Maybe
, который может содержать только объект типа T
.
Также ваша функция map
неправильная.
public <R> Maybe <T> map(Function<T, R> func)
Предполагается, что после того, как к вашему T
будет применено func
, у вас будет Maybe<T>
. Но на самом деле у вас будет Maybe<R>
, потому что R
- это то, что func
производит.
Это будет иметь больше смысла:
public <R> Maybe<R> map(Function<T, R> func) {
if (isPresent()) {
return new Maybe<R>(func.apply(cont));
}
return new Maybe<R>();
}
Вот код, работающий:
jshell> String txt = "Hi";
txt ==> "Hi"
jshell> String msg = Maybe.of(txt).filter(t -> t.length() > 0).orElse("Empty");
msg ==> "Hi"
jshell> txt = "";
txt ==> ""
jshell> msg = Maybe.of(txt).filter(t -> t.length() > 0).orElse("Empty");
msg ==> "Empty"