web-dev-qa-db-ja.com

ラムダ内でリターンを使用していますか?

以下のコードでは、tripsが空の場合は空のビューを表示してから戻り、以下のコードの実行を避けたいのですが、コンパイラは「ここではreturnは許可されていません」と言っています。

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        return
    }

    // run some code if it's not empty
}

そのように戻る方法はありますか?

私はif elseブロックにそれを置くことができることを知っていますが、他の場合は書くのが嫌いです、それはいくつかの条件がある場合、私の意見ではあまり理解できない/読みにくいです。

23
JozeRi

修飾された戻り構文を使用するだけです:return@fetchUpcomingTrips

Kotlinでは、ラムダ内のreturnは、最も内側のfunからの戻り(ラムダを無視)を意味し、 インライン ではないラムダでは許可されません。

return@label構文を使用して、返すスコープを指定します。ラムダが(fetchUpcomingTrips)に渡される関数の名前をラベルとして使用できます。

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        return@fetchUpcomingTrips 
    }

    // ...
}

関連:

44
hotkey

プレーンreturnは、関数から戻ることを提案します。ラムダ内の関数から戻ることができないため、コンパイラーは文句を言います。代わりに、ラムダから戻りたいので、ラベルを使用する必要があります。

 mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty()) {
                showEmptyViews()
                return@fetchUpcomingTrips
            }

            //run some code if it's not empty
        }
4
nhaarman

戻り値により、外部関数から戻ることができます。最も重要なユースケースは、ラムダ式からの戻りです

無名関数のreturnステートメントは、匿名関数自体から戻ります。

fun foo() {
ints.forEach(fun(value: Int) {
    if (value == 0) return  // local return to the caller of the anonymous fun, i.e. the forEach loop
    print(value)
})
}

値を返すとき、パーサーは修飾された戻り値を優先します。

return@a 1

「ラベル付き式(@a 1)を返す」ではなく、「ラベル@aで1を返す」ことを意味します。 Returnデフォルトでは、最も近い包囲関数または無名関数から戻ります。

Break最も近い囲みループを終了します。

Continue最も近い包囲ループの次のステップに進みます。

詳細は リターンとジャンプ、ブレークと継続ラベル を参照してください

1
sasikumar

returnの代わりに

mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty())
                showEmptyViews()
            else {
                //run some code if it's not empty
            }
        }
0
elect