【发布时间】:2022-01-22 19:54:57
【问题描述】:
我想做的是这样的:
Function<Function<Bill, Optional<?>>,Function<Bill, Optional<String>>> has =
fn -> b -> fn.apply(b).isPresent()
? emptyStrOpt.get()
: Optional.of("Missing");
Bill 可能有一个Claim。我想这样做:
has.apply(toClaim)
static final Function<Bill,Optional<Claim>> toClaim = b -> Optional.ofNullable(b.getClaim());
编译器不喜欢这样:
Required type: Function <Bill,Optional<?>>
Provider: Function <Bill,Optional<Claim>>
我想解决这个问题,我会写这样的东西来转换我传递给 Object 的函数:
static <R> Function<Bill,Optional<Object>> generifyOutput(Function<Bill,Optional<R>> toX){
return b -> toX.apply(b).map(x -> Optional.of((Object) x));
}
static final Function<Function<Bill,Optional<Object>>,
Function<String,
Function<Bill,Function<Bill,Optional<String>>>>> isPresent =
toX -> missingMsg -> b ->
toX.apply(b).isPresent()
? (Bill x) -> emptyStrOpt.get()
: (Bill x) -> Optional.of(missingMsg);
然后拨打isPresent.apply(generifyOutput(toClaim)).apply("No claim")
但是编译器吓坏了,说我提供的是Function<Bill, ? extends Object> 而不是Function<Bill,Optional<String>>
还有什么我可以在这里做的吗?我可以像暴力破解一样
Function<Bill,Optional<String>> hasClaim =
b -> toClaim.apply(b).isPresent()
? emptyStrOpt.get()
: Optional.of("No claim");
这似乎有点笨拙,对Bill 的每个可空成员重复相同的逻辑
【问题讨论】:
标签: java generics functional-programming