Option i nullable: kiedy używać każdego z nich
Porównaj typ Option w Arrow z typami nullable w Kotlinie i wybierz odpowiednie rozwiązanie.
Option i nullable: kiedy używać każdego z nich to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Dwa sposoby reprezentowania braku wartości
Typy nullable w Kotlinie
T? to idiomatyczny wybór do reprezentowania braku wartości w większości kodu Kotlin. Kompilator wymusza sprawdzanie wartości null, operator bezpiecznego wywołania ?. pozwala płynnie łączyć wywołania, a ?: "default" zwięźle zapewnia wartość zastępczą:
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"Option<A> biblioteki Arrow
Option opakowuje koncepcję wartości nullable w pełnoprawny typ algebraiczny z metodami map, flatMap, filter, fold i innymi. Naturalnie integruje się ze stylem potoków funkcyjnych biblioteki Arrow:
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = NoneKonwersja między Option a nullable
Można swobodnie konwertować wartości: value?.toOption() opakowuje nullable w Option; option.getOrNull() wyodrębnia wartość albo zwraca null; option.getOrElse { default } zapewnia wartość zastępczą:
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()map i flatMap dla Option
map { } przekształca wartość Some (a None pozostawia bez zmian). flatMap { } łączy operacje, które same zwracają Option:
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // Nonefilter dla Option
filter { predicate } zamienia Some na None, jeśli predykat zwróci wartość false:
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold: obsługa Option
fold(ifEmpty, ifSome) obsługuje oba przypadki w jednym wyrażeniu, bez dopasowywania wzorców:
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)Kiedy wybrać nullable T?
Należy wybrać typ nullable Kotlina (T?), gdy:
- pisze się idiomatyczny kod Kotlin, który będą czytać inni programiści
- potrzebne są łańcuchy wywołań bezpieczne dla wartości null (
?.,?:) - typ jest używany w interfejsach API, które nie korzystają z Arrow
- wydajność ma kluczowe znaczenie (brak narzutu związanego z boxingiem)
Kiedy wybrać Option<A>
Należy wybrać Option, gdy:
- używa się już potoku funkcyjnego biblioteki Arrow (
map,flatMap) - potrzebne jest łączenie opcjonalnych wartości z
EitherlubRaise - brak wartości ma być jawnie reprezentowany w ogólnym kontekście funkcyjnym
- buduje się bibliotekę, z której mogą korzystać wywołujący nieużywający Kotlina
Option wewnątrz either { }
Wewnątrz bloku either { } biblioteki Arrow można wywołać .bind() na obiekcie Option, najpierw konwertując go do Either:
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}Antywzorzec Option
Nie używaj Option wszędzie tylko dlatego, że istnieje. W Kotlinie String? jest w większości kodu aplikacji czytelniejsze niż Option. Używaj Option wtedy, gdy jego operatory funkcyjne rzeczywiście wnoszą wartość.
Szybkie sprawdzenie
Co zwraca None.map { it.length } w typie Option biblioteki Arrow?
Podsumowanie: Option i typy nullable
Najważniejsze informacje:
- Kotlinowe
T?: idiomatyczne rozwiązanie w większości kodu; wymuszane przez kompilator; używa?.i?: - Arrow
Option: typ algebraiczny z operatorami funkcyjnymi (map,flatMap,fold,filter) - Konwertuj za pomocą
.toOption()i.getOrNull() - Preferuj
T?w idiomatycznym Kotlinie; wybierajOptionpodczas tworzenia funkcyjnych potoków operacji z użyciem Arrow
Często zadawane pytania
Czy lekcja „Option i nullable: kiedy używać każdego z nich” jest bezpłatna?
Tak — pełny tekst „Option i nullable: kiedy używać każdego z nich” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Option i nullable: kiedy używać każdego z nich”?
Porównaj typ Option w Arrow z typami nullable w Kotlinie i wybierz odpowiednie rozwiązanie. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Option i nullable: kiedy używać każdego z nich”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Either : typowana obsługa błędów bez wyjątków
- DSL Raise w Arrow: składanie typowanych błędów
- Option i nullable: kiedy używać każdego z nich
- Funkcjonalne modelowanie domeny za pomocą typów podstawowych Arrow