Czy istnieje sposób na połączenie wielu let dla wielu zmiennych dopuszczających wartość null w kotlin?
fun example(first: String?, second: String?) {
first?.let {
second?.let {
// Do something just if both are != null
}
}
}
Mam na myśli coś takiego:
fun example(first: String?, second: String?) {
first?.let && second?.let {
// Do something just if both are != null
}
}
Odpowiedzi:
Jeśli jesteś zainteresowany, oto dwie z moich funkcji do rozwiązania tego problemu.
Stosowanie:
źródło
Oto kilka odmian, w zależności od tego, jakiego stylu będziesz chciał użyć, jeśli masz wszystko tego samego lub różnych typów i jeśli lista nieznana liczba elementów ...
Typy mieszane, wszystkie nie mogą mieć wartości null, aby obliczyć nową wartość
W przypadku typów mieszanych można utworzyć serię funkcji dla każdej liczby parametrów, które mogą wyglądać głupio, ale działają dobrze dla typów mieszanych:
Przykładowe użycie:
Wykonaj blok kodu, gdy lista nie zawiera elementów zerowych
Dwa warianty tutaj, po pierwsze, aby wykonać blok kodu, gdy lista zawiera wszystkie elementy niepuste, a po drugie, aby zrobić to samo, gdy lista zawiera co najmniej jeden element niezerowy. Oba przypadki przekazują listę elementów niezerowych do bloku kodu:
Funkcje:
Przykładowe użycie:
Niewielka zmiana, aby funkcja otrzymywała listę elementów i wykonywała te same operacje:
Przykładowe użycie:
Te odmiany można zmienić, aby zwracały wartości, takie jak
let()
.Użyj pierwszego niezerowego przedmiotu (Coalesce)
Podobnie jak w przypadku funkcji SQL Coalesce, zwraca pierwszy element inny niż pusty. Dwa smaki funkcji:
Przykładowe użycie:
Inne odmiany
... Istnieją inne odmiany, ale przy większej specyfikacji można to zawęzić.
źródło
whenAllNotNull
z demontażu struktury tak:listOf(a, b, c).whenAllNotNull { (d, e, f) -> println("$d $e $f")
.Możesz w tym celu napisać własną funkcję:
źródło
Możesz stworzyć
arrayIfNoNulls
funkcję:Możesz go następnie użyć dla zmiennej liczby wartości z
let
:Jeśli masz już tablicę, możesz utworzyć
takeIfNoNulls
funkcję (inspirowanątakeIf
irequireNoNulls
):Przykład:
źródło
W przypadku, gdy sprawdzasz tylko dwie wartości i nie musisz pracować z listami:
Przykład użycia:
źródło
Właściwie możesz to po prostu zrobić, wiesz? ;)
Nie ma nic złego w korzystaniu z normalnej kontroli zerowej w Kotlinie.
Jest znacznie bardziej czytelny dla każdego, kto zajrzy do Twojego kodu.
źródło
let
skrót do wykonania tych kontroliWłaściwie wolę rozwiązać ten problem za pomocą następujących funkcji pomocniczych:
A oto jak ich używać:
źródło
Rozwiązałem to, tworząc funkcje, które w mniejszym lub większym stopniu replikują zachowanie with, ale przyjmują wiele parametrów i tylko wywołują funkcję, dla której wszystkie parametry nie są zerowe.
Następnie używam tego w ten sposób:
Oczywistym problemem jest to, że muszę zdefiniować funkcję dla każdego przypadku (liczby zmiennych), których potrzebuję, ale przynajmniej myślę, że kod wygląda czysto, gdy ich używam.
źródło
Ty też możesz to zrobić
źródło
Zaktualizowałem nieco oczekiwaną odpowiedź:
to umożliwia:
źródło
Dla dowolnej ilości wartości do sprawdzenia możesz użyć tego:
I będzie używany w ten sposób:
elementy wysłane do bloku używają symboli wieloznacznych, musisz sprawdzić typy, jeśli chcesz uzyskać dostęp do wartości, jeśli potrzebujesz tylko jednego typu, możesz zmienić to na ogólne
źródło