Kotlin ma bardzo ładne funkcje iteracyjne, takie jak forEach
lub repeat
, ale nie jestem w stanie zmusić operatorów break
i do continue
pracy z nimi (zarówno lokalnymi, jak i nielokalnymi):
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Celem jest naśladowanie zwykłych pętli przy możliwie najbliższej składni funkcjonalnej. Z pewnością było to możliwe w niektórych starszych wersjach Kotlina, ale mam problem z odtworzeniem składni.
Problemem może być błąd z etykietami (M12), ale myślę, że pierwszy przykład powinien i tak działać.
Wydaje mi się, że czytałem gdzieś o specjalnej sztuczce / adnotacji, ale nie mogłem znaleźć żadnego odniesienia na ten temat. Może wyglądać następująco:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
continue@label
ibreak@label
), zobacz powiązane pytanie: stackoverflow.com/questions/34642868/…break
icontinue
dla pętli funkcjonalnych, czy też szukasz alternatywnych odpowiedzi, które robią dokładnie to samo. Wydaje się, że tak jest w pierwszym przypadku, ponieważ odrzuciłeś to drugie.Odpowiedzi:
Edycja :
Zgodnie z dokumentacją Kotlina jest to możliwe przy użyciu adnotacji.
Oryginalna odpowiedź :
Ponieważ podajesz a
(Int) -> Unit
, nie możesz od niego zerwać, ponieważ kompilator nie wie, że jest używany w pętli.Masz kilka opcji:
Użyj zwykłej pętli for:
Jeśli pętla jest ostatnim kodem w metodzie,
której możesz użyć
return
do wyjścia z metody (lubreturn value
jeśli nie jest tounit
metoda).Użyj metody
Utwórz niestandardową metodę powtarzania, która wraca
Boolean
do kontynuacji.źródło
break
icontinue
działają tylko w pętlach.forEach
,repeat
a wszystkie inne metody są po prostu: metodami, a nie pętlami. Yoav przedstawił kilka alternatyw, alebreak
icontinue
po prostu nie zamierza pracować nad metodami.continue@label
ibreak@label
), zobacz powiązane pytanie: stackoverflow.com/questions/34642868/…Spowoduje to wyświetlenie od 1 do 5.
return@forEach
Działa jak słowo kluczowecontinue
w Javie, co oznacza, że w tym przypadku nadal wykonuje każdą pętlę, ale przeskakuje do następnej iteracji, jeśli wartość jest większa niż 5.Spowoduje to wydrukowanie od 1 do 10, ale pominie 5.
Wypróbuj je na placu zabaw Kotlin .
źródło
continue
break
Przerwę można uzyskać za pomocą:
Kontynuację można osiągnąć dzięki:
Jak każdy tutaj zaleca ... przeczytaj dokumentację: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
źródło
@loop
daje ten sam pożądany efekt.transform
gdzie można się zepsuć pod pewnymi warunkami, np.reduceReturnIf(acc, value, returnIf: func)
Możesz użyć zwrotu z wyrażenia lambda, które naśladuje
continue
lub wbreak
zależności od zastosowania.Jest to omówione w powiązanym pytaniu: Jak zrobić „przerwę” lub „kontynuację” w pętli funkcjonalnej w Kotlinie?
źródło
Jak mówi dokumentacja Kotlin , najlepszym rozwiązaniem
return
jest używanie . Zaletą kotlin jest to, że jeśli masz zagnieżdżone funkcje, możesz użyć etykiet do bezpośredniego zapisu, skąd pochodzi zwrot:Zwrot zakresu funkcji
i Local Return (nie przestaje przechodzić przez forEach = kontynuacja)
Sprawdź dokumentację, jest naprawdę dobra :)
źródło
forEach
continue
zachowanie typu wforEach
dla
break
zachowania typu musisz użyćfor in until
lubfor in
zgodnie z listą jestNullable
lubNon-Nullable
W przypadku listy wartości zerowej :
Dla listy bez wartości null :
źródło
Instrukcja Break dla zagnieżdżonych pętli forEach ():
Wynik:
Kontynuuj instrukcję z funkcją anonimową:
Wynik:
źródło
może zmienić forEach na
działa na hashmaps
źródło
Wiem, że to może nie do końca związane z przerwa trwać
forEach
, ale skoro1.3.70
mamyscan
tak, że możemy przynajmniej uzyskać wyniki pośrednie.Więc teraz, jeśli możesz zebrać wszystkie wyniki (podobne do
map
), których możesz nie potrzebować, jednak jeśli pozwolisz na zakończenie, możesz pominąć przerwę i po prostu sprawdzić ostateczną tablicę.IMHO, podstawowe programowanie funkcjonalne tak naprawdę nie uwzględnia
transform
operacji, która musi wyskoczyć w środku, nie kończąc jej. Aby naprawdę rozwiązać ten problem, musimy skonstruować funkcję, która bierze pod uwagę warunek zwrotu, np.źródło