可选地将类型转换映射到子类对象

San*_*eep 2 java optional java-8

我正在尝试编写以下代码,其中C是子类B.并且getValue方法仅在C,而不是在B.但Eclipse在此声明中显示错误:

Optional.ofNullable(A).map(A::getB).map(C::getValue);
Run Code Online (Sandbox Code Playgroud)

如果是正常情况,我们将输入类似的转换和写入((C)a.getB()).getValue().我怎么写一个相同的Optional

khe*_*ood 6

您可以添加map(C.class::cast)到您的链中.

Optional.ofNullable(aOrNull).map(A::getB).map(C.class::cast).map(C::getValue);
Run Code Online (Sandbox Code Playgroud)

您还可以组合一些地图链.

如果getB()永远不会返回null,您可能只有:

Optional.ofNullable(aOrNull).map(a -> ((C) a.getB()).getValue());
Run Code Online (Sandbox Code Playgroud)

要保留Optionalif getB()返回null 的null避免行为,您可以:

Optional.ofNullable(aOrNull).map(A::getB).map(b -> ((C) b).getValue());
Run Code Online (Sandbox Code Playgroud)