在方法中使用通用谓词和函数
Using Generic Predicate and Function in a method
我对这里的泛型还很陌生,需要一些帮助。
我正在尝试使用通用 Predicate
、通用 java.util Function
、通用 List
作为参数创建通用方法。方法是这样的:
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;
}
我在 orElse(elseResult)
方法上遇到错误。这是错误-
The method orElse(capture#1-of ? extends Object) in the type Optional<capture#1-of ? extends Object> is not applicable for the arguments (T).
我不太确定这个错误是什么意思。那么有人可以告诉我我在这里做错了什么吗?谢谢。
你的 mapper
可以 return 任何东西,所以你的 orElse
方法不一定 return 一个 T
.
如果您将 mapper
更改为 Function<T,T> mapper
,您的代码将通过编译。
如果您希望映射器能够 return 不同的类型,请添加第二个类型参数:
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;
}
我对这里的泛型还很陌生,需要一些帮助。
我正在尝试使用通用 Predicate
、通用 java.util Function
、通用 List
作为参数创建通用方法。方法是这样的:
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;
}
我在 orElse(elseResult)
方法上遇到错误。这是错误-
The method orElse(capture#1-of ? extends Object) in the type Optional<capture#1-of ? extends Object> is not applicable for the arguments (T).
我不太确定这个错误是什么意思。那么有人可以告诉我我在这里做错了什么吗?谢谢。
你的 mapper
可以 return 任何东西,所以你的 orElse
方法不一定 return 一个 T
.
如果您将 mapper
更改为 Function<T,T> mapper
,您的代码将通过编译。
如果您希望映射器能够 return 不同的类型,请添加第二个类型参数:
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;
}