Tak, to prawda, jeśli ostatnia instrukcja lambda jest wyrażeniem, uznaje się ją za wartość zwracaną.
Oto what the reference says (dzięki @KirillRakhman):
Możemy wyraźnie zwrócić wartość z lambda przy użyciu składni qualified return. W przeciwnym razie wartość ostatniego wyrażenia jest nieodwracalnie zwracana. Dlatego dwa następujące fragmenty są równoważne:
ints.filter {
val shouldFilter = it > 0
shouldFilter
}
ints.filter {
val shouldFilter = it > 0
[email protected] shouldFilter
}
Ostatnio semantykę stwierdzenie jest również prawdziwe dla if
(that's why there's no ternary operator), when
i try
-catch
bloków, a te stwierdzenia są wyrażenia siebie:
val foo = if (bar) {
doSomething()
baz
} else {
doSomethingElse()
qux
}
Patrz również: examples for when
and try
-catch
.
Tak, lambdy są zgodne z konstrukcjami językowymi w tym zakresie.
Jeśli chcesz dokonać wyraźnego return
oświadczenie w lambda, użyj [email protected]
syntax (także another answer with examples). Nie oznaczony etykietą return
, przeciwnie, działa z najbliższym fun
(ignorując lambda), a zatem może występować tylko w lambdach, które są inlined.
Pojawił się , aby dodać specjalną składnię dla wartości emitującej wartość z bloku kodu, ale została ona odrzucona.
Po prostu pomocna wskazówka, możesz ją skrócić do 'val numsPlusOne = nums.map {it + 1}' (ponieważ 'it' jest implikowane, jeśli nie jest podane, i jeśli' it + 1' jest ostatnią linią, to wynik zostanie zwrócony jako wyjaśniony @hotkey) –