2016-08-04 31 views
8

Mam metodę, która zwraca java.util.Optional<Something>. Chcę użyć tej metody z Kotlin i chcę mój wynik będzie Something? nie Optional<Something>Jak mapować java.util.Optional <Something> na coś? w Kotlin

Jak to zrobić w Kotlin, w idiomatycznym sposób?

dzwoń pod numer pod numerem Optional, ale naprawdę nie wygląda mi to dobrze. Kotlin nie narzeka, jeśli napiszę: val msg: Something = optional.orElse(null). (msg jest zadeklarowany jako Something, a nie Something? - tracę kontrolę typu kompilacji).

używam Kotlin 1.0.3

Odpowiedz

13

Extend Java API z metodą do otwierania Optional:

fun <T> Optional<T>.unwrap(): T? = orElse(null) 

następnie używać go jak chcesz:

val msg: Something? = optional.unwrap() // the type is enforced 

Zobacz https://kotlinlang.org/docs/reference/extensions.html o szczegóły .

+3

KOTLIN-stdlib zawiera "lub null" funkcje (np 'firstOrNull'' lastOrNull', itd.). Możesz rozważyć użycie "orNull" zamiast "unwrap". – mfulton26

1

orNull() jest lepszy.

Przykładowo

// Java 
public class JavaClass 
    public Optional<String> getOptionalString() { 
    return Optional.absent(); 
    } 
} 

// Kotlin 
val optionalString = JavaClass().getOptionalString().orNull() 

Definicja 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(); 
Powiązane problemy