Apakah mungkin break
dari Groovy .each{Closure}
, atau haruskah saya menggunakan loop klasik?
143
Tidak, Anda tidak dapat membatalkan "masing-masing" tanpa melemparkan pengecualian. Anda mungkin menginginkan loop klasik jika Anda ingin jeda untuk dibatalkan dalam kondisi tertentu.
Atau, Anda bisa menggunakan penutupan "find" alih-alih setiap dan mengembalikan true ketika Anda akan melakukan break.
Contoh ini akan dibatalkan sebelum memproses seluruh daftar:
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
Cetakan
1
2
3
4
5
tetapi tidak mencetak 6 atau 7.
Juga sangat mudah untuk menulis metode iterator Anda sendiri dengan perilaku istirahat kustom yang menerima penutupan:
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
Juga mencetak:
1
2
3
4
5
find
lebih baik daripadaany
- lihat jawaban lain di bawah ini dari @Michal yang satu bekerja untuk sayadef test = [2] test.findResult{ it * 2 }
akan mengembalikan 4 bukannya 2Ganti setiap loop dengan penutupan apa pun .
Keluaran
sumber
any()
cara ini agak menyesatkan, tetapi tentu saja itu berhasil dan memberi Anda kemampuan untuk istirahat atau melanjutkan .Tidak, Anda tidak dapat melepaskan diri dari penutupan di Groovy tanpa melempar pengecualian. Selain itu, Anda tidak boleh menggunakan pengecualian untuk aliran kontrol.
Jika Anda mendapati diri Anda ingin keluar dari penutupan, Anda mungkin harus terlebih dahulu memikirkan mengapa Anda ingin melakukan ini dan bukan bagaimana melakukannya. Hal pertama yang harus dipertimbangkan adalah penggantian penutupan yang dipertanyakan dengan salah satu fungsi tingkat tinggi Groovy (konseptual). Contoh berikut:
menjadi
menjadi
yang juga membantu kejelasan. Ini menyatakan maksud dari kode Anda jauh lebih baik.
Kelemahan potensial dalam contoh yang ditunjukkan adalah bahwa iterasi hanya berhenti lebih awal pada contoh pertama. Jika Anda memiliki pertimbangan kinerja, Anda mungkin ingin menghentikannya saat itu juga.
Namun, untuk sebagian besar kasus penggunaan yang melibatkan iterasi, Anda biasanya dapat menggunakan salah satu dari metode penemuan, penjelajahan, pengumpulan, injeksi, dll. Mereka biasanya mengambil beberapa "konfigurasi" dan kemudian "tahu" bagaimana melakukan iterasi untuk Anda, sehingga Anda benar-benar dapat menghindari perulangan imperatif sedapat mungkin.
sumber
Hanya menggunakan Penutupan khusus
sumber
(1..10). Masing-masing {
jika (<5)
cetak itu
lain
kembali salah
sumber
each
, itu hanya tidak mencetak nilai lebih besar dari 4. Halelse
ini berlebihan, kode Anda akan melakukan hal yang sama tanpanya. Juga, Anda dapat membuktikaneach
tidak putus denganreturn false
jika Anda memasukkanprintln "not breaking"
setelahelse
dan sebelumreturn false
.Anda bisa istirahat
RETURN
. Sebagai contohIni bekerja untuk saya!
sumber
any
metode array dengan kembalifalse
. Anda tidak dapat merusakeach
metode dengan cara yang sama.