Aron:
Soy bastante nuevo a los genéricos aquí y me gustaría un poco de ayuda.
Estoy intentando crear un método genérico con un genérico Predicate
, un genérico java.util Function
, un genérico List
como argumentos. El método es la siguiente:
public static <T> T getValue(Predicate<? super Object> condition, Function<? super Object, ? extends Object> mapper, T elseResult, List<T> table) {
T result = null;
if (table != null)
result = table.stream()
.filter(condition)
.map(mapper).findAny().orElse(elseResult); // Syntax error here.
else
result = elseResult;
return (T) result;
}
Recibo un error en el orElse(elseResult)
método. Este es el error -
The method orElse(capture#1-of ? extends Object) in the type Optional<capture#1-of ? extends Object> is not applicable for the arguments (T).
No estoy exactamente seguro de lo que este error se trata. Entonces, ¿podría alguien decirme lo que estoy haciendo mal aquí? Gracias.
Eran :
Su mapper
puede devolver nada, por lo que su orElse
método no necesariamente devolver una T
.
Si cambia de mapper
a Function<T,T> mapper
, su código pasará compilación.
Si desea que su mapeador para poder devolver un tipo diferente, añadir un segundo argumento de tipo:
public static <T,S> S getValue(Predicate<? super Object> condition, Function<T,S> mapper, S elseResult, List<T> table) {
S result = null;
if (table != null)
result = table.stream()
.filter(condition)
.map(mapper).findAny().orElse(elseResult);
else
result = elseResult;
return result;
}