Saya punya masalah dengan aliran Java 8 foreach mencoba untuk melanjutkan item berikutnya dalam lingkaran. Saya tidak dapat mengatur perintah seperti continue;
, hanya return;
berfungsi tetapi Anda akan keluar dari loop dalam kasus ini. Saya perlu melanjutkan item berikutnya dalam lingkaran. Bagaimana saya bisa melakukan itu?
Contoh (tidak berfungsi):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).foreach(line -> {
...
if(...)
continue; // this command doesn't working here
});
}
Contoh (bekerja):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).collect(Collectors.toList());
}
for(String filteredLine : filteredLines){
...
if(...)
continue; // it's working!
}
continue
untuk tetap pindah ke item berikutnya tanpa perubahan fungsi apa pun.else
blok. Jika tidak ada setelahnyacontinue
, maka lepaskan blok if dan lanjutkan: tidak ada gunanya.Jawaban:
Menggunakan
return;
akan bekerja dengan baik. Ini tidak akan mencegah pengulangan penuh dari penyelesaian. Ini hanya akan berhenti menjalankan iterasiforEach
loop saat ini.Coba program kecil berikut ini:
Keluaran:
Perhatikan bagaimana
return;
dieksekusi untukb
iterasi, tetapic
mencetak pada iterasi berikut dengan baik.Mengapa ini berhasil?
Alasan mengapa perilaku tersebut tampak tidak intuitif pada awalnya adalah karena kita terbiasa dengan
return
pernyataan yang mengganggu pelaksanaan seluruh metode. Jadi dalam kasus ini, kami mengharapkanmain
eksekusi metode secara keseluruhan dihentikan.Namun yang perlu dipahami adalah ungkapan lambda itu, seperti:
... benar-benar perlu dianggap sebagai "metode" tersendiri, benar-benar terpisah dari
main
metode, meskipun itu terletak di dalamnya. Jadi sungguh,return
pernyataan itu hanya menghentikan eksekusi ekspresi lambda.Hal kedua yang perlu dipahami adalah:
... benar-benar hanya loop normal di bawah sampul yang mengeksekusi ekspresi lambda untuk setiap iterasi.
Dengan memperhatikan 2 poin ini, kode di atas dapat ditulis ulang dengan cara yang setara berikut (hanya untuk tujuan pendidikan):
Dengan padanan kode "kurang ajaib" ini, cakupan
return
pernyataan menjadi lebih jelas.sumber
Solusi lain: melalui filter dengan kondisi terbalik Anda: Contoh:
bisa diganti dengan
Pendekatan paling lugas tampaknya menggunakan "kembali;" meskipun.
sumber
Lambda yang Anda teruskan
forEach()
dievaluasi untuk setiap elemen yang diterima dari aliran. Iterasi itu sendiri tidak terlihat dari dalam cakupan lambda, jadi Anda tidak dapatcontinue
melakukannya seolah-olahforEach()
makro praprosesor C. Sebagai gantinya, Anda dapat melewati sisa pernyataan di dalamnya secara kondisional.sumber
Anda dapat menggunakan
if
pernyataan sederhana daripada melanjutkan. Jadi, alih-alih cara Anda memiliki kode, Anda dapat mencoba:Predikat dalam pernyataan if hanya akan menjadi kebalikan dari predikat dalam
if(pred) continue;
pernyataan Anda , jadi gunakan saja!
(tidak logis).sumber