Yazar | Sessiz Kral
Kaynak | CSDN Blog Uzmanı
Üretilen | CSDN (ID: CSDNNEWS)
Bazen, Lambda ifadesindeki değişkenin değerini değiştirmemiz gerekir, ancak doğrudan değiştirmeye çalışırsanız, derleyici duymadan görmez, bizi uyarır: "Lambda ifadesinde değişken kullanım veya etkili bir şekilde nihai" .
Bu sorunun nedeni, bunun Java spesifikasyonunda belirtilmesidir:
Herhangi bir yerel değişken, fmal parametresi veya istisna parametresi kullanılan ancak bir lambda ifadesinde bildirilen
Final beyan edilmeli veya etkili bir şekilde final olmalıdır (§4.12.4),
Veya kullanıcının denendiği yerde derleme zamanı hatası oluşur.
Kaba anlam, lambda ifadesinde kullanılacak, ancak lambda ifadesinde bildirilmeyen değişkenlerin nihai veya etkili bir şekilde nihai olarak ilan edilmesi gerektiğidir, aksi takdirde derleme hataları oluşacaktır.
Son ve etkili bir şekilde son arasındaki farkla ilgili olarak, bazı arkadaşlar çok açık olmayabilir. Burada iki kelime daha.
1Final int a; 2a = 1; 3 // a = 2; 4 // A son olduğu için geri ödenemez 5 6Int B; 7b = 1; 8 // b o zamandan beri değişmedi 9 // B etkili bir şekilde nihai 10 11int C; 12c = 1; 13 // C önce 1'e atanır ve sonra 2'ye yeniden atanır 14c = 2; 15 // C etkili bir şekilde nihai değilSon ve etkili bir şekilde nihai arasındaki farkı anladıktan sonra, sınır nihai olarak tanımlanırsa, lambda ifadesindeki değişkenin değerini değiştiremeyeceğini öğrendik. İyi bir çözüm var mı? Derleyici sadece uyarılamaz, aynı zamanda değişkenin değerini de değiştirebilir.
Bunu düşündükten sonra, deneyin ve sonunda üç uygulanabilir çözüm buluyorum:
1) Sınır değişkeni statik olarak belirtin.
2) Sınır değişkeni atomicinteger olarak belirtin.
3) Dizi kullanın.
Onları ayrıntılı olarak tanıtalım.
Sınır değişkeni statik olarak bildirin
Sınır değişkeni statik olarak bildirmek istiyorsanız, ana yöntemin kendisi statik olduğu için sınır değişkeni ana yöntemin dışına koymalısınız. Tam kod örneği aşağıda gösterilmiştir.
1Public Class ModelVariable2StaticIdelambda { 2 statik int sınırı = 10; 3 genel statik void ana (dize args) {{ 4 Runnable R = - > {{ 5 limit = 5; 6 (int i = 0; i < sınır; i ++) { 7 System.out.println (i); 8} 9}; 10 yeni iplik (r) .start; 11} 12}Program çıktısının sonuçlarına bir göz atın:
10 yirmi bir 32 43 54Tamam, bu plan mümkün.
Sınır değişkeni AtomicInteger olarak bildirin
AtomicInteger, INT değerinin atomik olmasını sağlayabilir. Yeni bir INT değeri ayarlamak için SET yöntemini kullanabilirsiniz. Geçerli INT değerini almak için Get yöntemi.
1Public Class ModelVariable2atomicInIndelambda {{ 2 genel statik void ana (dize args) {{ 3 Nihai Atomicinteger Limit = Yeni AtomicInteger (10); 4 Runnable R = - > {{ 5 Limit.Set (5); 6 (int i = 0; i < limit.get; i ++) { 7 System.out.println (i); 8} 9}; 10 yeni iplik (r) .start; 11} 12}Program çıktısının sonuçlarına bir göz atın:
10 yirmi bir 32 43 54Tamam, bu plan da mümkün.
Dizi
Bir dizinin kullanımı biraz aldatılır. Dizi bildirildiğinde, final olarak ayarlanır, ancak int değerini değiştirirken dizinin değeri değiştirilir.
1Public Class ModelVariable2ArrayinSidelambda {{ 2 genel statik void ana (dize args) {{ 3 final int limitleri = {10}; 4 Runnable R = - > {{ 5 sınır = 5; 6 (int i = 0; i < sınırlar; i ++) { 7 System.out.println (i); 8} 9}; 10 yeni iplik (r) .start; 11} 12}Program çıktısının sonuçlarına bir göz atın:
10 yirmi bir 32 43 54Tamam, bu plan da mümkün.
Sevgili okuyucular ve arkadaşlar, yukarıdakiler bu makalenin tüm içeriğidir, çok ilginç hissettiriyor mu? Derleyici bize Lambda ifadesinin dışındaki değişkenleri değiştirmek istediğimizi söylüyor, ancak başka çözümler bulduk ve ayrıca var bir tane. 3 arıyor, beceri paketinin tekrar yükseltildiğini düşünüyor musunuz, var mı? Kendinize bir övgü vermek için küçük elinizi uzatın.
Not: Bu makaledeki örnek kod, kod bulutu ile senkronize edildi, Portal .
https://gitee.com/qing_gee/javapoint/tree/master
Orijinal Bağlantı:
https://blog.csdn.net/qing_gee/article/details/104438986