使用< code>Optional,我想根据映射结果返回接口的某个实现(< code>First或< code>Second)。这是< code>First和< code>Second实现的接口:
public interface MyInterface {
Number number();
}
以下< code>Optional用法是错误的:
final String string = ... // might be null
final Number number = Optional.ofNullable(string)
.map(string -> new First())
.orElse(new Second()) // erroneous line
.number();
orElse(com.mycompany.First)
,可选
既然类<code>First<code>和<code>Second<code>都实现了接口<code>MyInterface<code>并且方法<code>MyInterface::number<code>返回<code>number<code>,为什么行会出错?如何正确实现这一点?
我会在没有明确演员阵容的情况下写道:
Optional.ofNullable(string)
.map(s -> {
MyInterface m = new First();
return m;
})
.orElse(new Second())
.number();
问题在于Java推断映射类型为<code>First</code>,而<code>Second</code>不是<code>First</code>的实例。您需要显式地给Java一些提示,以了解正确的类型:
private static void main(String... args)
{
final String string = "";
final Number number = Optional.ofNullable(string)
.<MyInterface>map(str -> new First()) // Explicit type specified
.orElse(new Second())
.number();
}
这是沿着方法链的类型推断的一般限制。不限于< code >可选。
有人建议沿方法链进行类型推断工作。请参阅此问题:泛型类型推断不适用于方法链接?
也许在未来版本的Java编译器会聪明到足以解决这个问题。谁知道呢。
我发现方法< code>Optional::map返回< code>U,它不允许将返回的< code>First应用到另一个类型,例如< code>Second。显式转换到其接口或在< code>map方法中要求它是一种方法:
final Number number = Optional.ofNullable("")
.<MyInterface>map(string -> new First())
.orElse(new Second())
.number();
__
< sup >编辑:这个是我发帖后发现的。然而,我两个都留着,因为我还没有在其他地方找到类似的解决方案。
为了丰富运营体验,让开发者更好的体验积分商城功能,兑吧提支持更多的扩展功能 . 支持的扩展功能包含: 1. 游客用户唤醒登录 2. 自有虚拟商品充值 接口说明 充值接口API文档 通知接口API文档 3.加积分接口 接口说明 API文档 4.免登URL自定义参数 dcustom参数 transfer参数 signKeys参数 5. 会员等级功能 6.前置商品查询接口 7. 【秒杀商品】前置查询接口
考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?
使用Java8已经有6个多月了,我对新的API变化非常满意。我仍然不确定的一个方面是何时使用。我似乎在想要在任何地方都使用它(有些东西可能是)和根本不在任何地方)之间摇摆。 当我可以使用它时,似乎有很多情况,但我从来不确定它是增加了好处(可读性/空安全性)还是仅仅导致了额外的开销。 因此,我有几个例子,我想了解社区对是否有益的看法。 1-当方法可以返回时,作为公共方法返回类型: 2-当参数可能为时
我在我的项目分级文件中收到了这样的警告: 警告:(16,5)“生成类型”不能应用于“(groovy.lang.closure )” 我的buildTypes部分是: 我目前使用的是Android Studio 1.1.0、CompilesDKVersion22、BuildToolsVersion22.0.0和TargetSDKVersion22。我试着退让到21岁,但还是收到了警告。 是什么导致了
还是这些标准的功能接口(消费者、供应商、谓词、函数)是用来充当代码组织、可读性、结构、[其他]的模板?
编译错误->[无法推断flatMap(函数>)的类型参数]