如何将java.util.Optional <something>映射到Something?在Kotlin

时间:2016-08-04 12:28:42

标签: java-8 kotlin optional

我有一个返回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

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)