我有一个返回java.util.Optional<Something>
的方法。
我想在Kotlin中使用该方法,我希望我的结果为Something?
,而不是Optional<Something>
如何以惯用的方式在Kotlin做到这一点?
在.orElse(null)
上调用Optional
确实给了我Something?
,但看起来并不好。如果我写val msg: Something = optional.orElse(null).
(msg
被声明为Something
,而不是Something?
,那么Kotlin不会抱怨 - 我放松了编译类型检查。)
我使用Kotlin 1.0.3
答案 0 :(得分:20)
使用解包Optional
的方法扩展java API:
fun <T> Optional<T>.unwrap(): T? = orElse(null)
然后按照您的意愿使用它:
val msg: Something? = optional.unwrap() // the type is enforced
有关详细信息,请参阅https://kotlinlang.org/docs/reference/extensions.html。
答案 1 :(得分:5)
// Java
public class JavaClass
public Optional<String> getOptionalString() {
return Optional.absent();
}
}
// Kotlin
val optionalString = JavaClass().getOptionalString().orNull()
更好。
例如,
orNull()
/**
* Returns the contained instance if it is present; {@code null} otherwise. If the instance is
* known to be present, use {@link #get()} instead.
*
* <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's
* {@code Optional.orElse(null)}.
*/
@Nullable
public abstract T orNull();
package has_status;
use Moose::Role;
has status_id => (
is=> 'ro',
isa=>'Int',
writer=>'_set_status_id'
);
sub status_change{
my $this = shift;
my %params = @_;#parameters are status_id, status_code
my $change_exit = $this->_status_change_exit_before();
}
sub _status_change_exit_before {
my $this=shift;
return ;
}
答案 2 :(得分:0)
Kotlin 中的可空类型可以有 value 或 null,因此您可以将 Optional 转换为可空类型,如下所示:
val str: SomeType? = Optional.of(SomeType_Value).map { it }.orElse(null)
例如对于我们有的 SomeType 字符串
val str: String? = Optional.of("someValue").map { it }.orElse(null)