Derleyici, Lambda ifadelerindeki değişkenlerin kesin olması gerektiğini söyledi, inanmıyorum | Kuvvet planı için

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ğil

Son 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 54

Tamam, 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 54

Tamam, 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 54

Tamam, 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

Sıcak ŞehirÜç çift eldiven giyseniz bile, "noktaya" gelmek için elinizden gelenin en iyisini yapmalısınız.
önceki
Bu irfan topu 92. dakikada patladı! 60 yaşındaki koç sinirlendi ve sahaya koştu ve hakem tarafından ihraç edildi.
Sonraki
Zhejiang Üniversitesi Birinci Hastanesinin Zhijiang Bölgesi'ndeki ilk ön saf sağlık personeli grubu kabinden çıktı
Bulut veritabanı DBaaS'nin ne olduğunu anlamak için 8 önemli nokta olan yeni veri işleme yöntemlerini keşfedin
Şok edici 7-2! Atlanta, Serie A 16.'yı tamamen yendi! Ligi 3 ardışık galibiyet ve neredeyse 5 raunt yenilgisiz kazandı
Kıdemli bir programcı olarak, bu siyah kelimeleri nasıl anlayamazsın?
24 dakikada 1-0! Wu Lei'nin tanrı düzeyindeki biyografisi şok edici bir etki yaratıyor, İspanyol Atletico Madrid'e bir rüya başlangıcıyla başladı
Programcıların yaklaşık yarısı bekardır ve yıllık maaşı 150.000'den azdır ve programcıların mevcut durumuna ilişkin önemli bir araştırma
Linhai Şehri, İş ve Üretimin Yeniden Başlaması için Kamu Refahı İş Fuarı Düzenledi
Bulut öldü, uzun ömürlü yerel dağıtım
2-1! 20 milyon kanat oyuncusu "dünya çapında" bir gol atmaya başlar ve 62.000 taraftar 44 dakika içinde büyük bir karnavala yakalanır
Hangzhou son salgın risk haritasını yayınladı, tüm caddeler düşük riskli ve düşük riskli
Çapraz platform uygulama pazarına kim hakim olacak?
4 gollü 3 eşsiz oyun! 25 yaşındaki yeni yardım Manchester United'ı tekrar kurtardı, Ocak ayında Red Devils uyluğuna katıldı
To Top