_ (alt çizgi) ayrılmış bir anahtar kelimedir


94

sAşağıdaki lambda ifadesini şu şekilde değiştirdim _:

s -> Integer.parseInt(s)

Eclipse derleyicisi diyor ki:

'_', kaynak seviyesi 1.8'den itibaren ayrılmış bir anahtar kelime olduğundan tanımlayıcı olarak kullanılmamalıdır.

JLS §3.9 Sözcüksel Yapı / Anahtar Sözcükler'de herhangi bir açıklama bulamadım .

Yanıtlar:


86

Bakılacak yer JLS §15.27.1'dir. Lambda Parametreleri

Bir lambda parametresinin adı _ (yani, tek bir alt çizgi karakteri) varsa, bu bir derleme zamanı hatasıdır.

_ Değişkeninin herhangi bir bağlamda kullanılması tavsiye edilmez. Java programlama dilinin gelecek sürümleri, bu adı bir anahtar sözcük olarak ayırabilir ve / veya ona özel anlamlar verebilir.

Dolayısıyla, Eclipse mesajı yanıltıcıdır, özellikle her iki durumda da aynı mesaj kullanıldığında, bir lambda parametresi için bir hata üretildiğinde veya başka herhangi bir _tanımlayıcı için bir uyarı üretildiğinde .


24
Java 9'dan itibaren, _yalnızca lambda parametre adı olarak değil, herhangi bir yasal tanımlayıcı adı olarak izin verilmeyeceğini unutmayın. Bu aslında derleme 43'te düzeltildi: bugs.openjdk.java.net/browse/JDK-8061549
Jean-François Savard

3
@lscoughlin: "Java programlama dilinin gelecekteki sürümleri bu adı anahtar kelime olarak ayırabilir ve / veya ona özel anlamlar verebilir" ifadesi yeterli değil mi? Pekala, "rezerve edebilir" ifadesini "kullanacak" ile değiştirin, resmi göreceksiniz. Belki bu posta referansı yardımcı olur…
Holger

6
Bu nedir? Java geriye dönük uyumluluğu bozuyor mu?
Arturo Torres Sánchez

8
@Arturo Torres Sánchez: Bu yeni bir şey değil. Orada kez ne zaman enumve assertyasal tanımlayıcılar ... idi
Holger

11
@Holger aslında bir isim yer tutucusu olarak alt çizgiyi kullanan tonlarca dil vardır (Scala, Clojure, F #, SML, Erlang, sadece birkaç isim). Bu, 90'lara veya 80'lere kadar uzanan yerleşik bir model, inanıyorum ki, bu yüzden uymamak garip.
om-nom-nom

25

Lambda ifadelerinde kullanılmayan parametreleri belirtmek için özel bir karakter olarak alt çizgi ekleyecek olan JEP 302'nin 2. Aşamasıdır .

Alt çizgi tedavisi

Birçok dilde, _adsız bir lambda parametresini belirtmek için alt çizgi ( ) kullanmak yaygındır (ve benzer şekilde yöntem ve istisna parametreleri için):

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

Bu, kullanılmayan argümanların daha güçlü statik kontrolüne izin verir ve ayrıca birden fazla argümanın kullanılmamış olarak işaretlenmesine izin verir. Bununla birlikte, alt çizgi Java 8'den itibaren geçerli bir tanımlayıcı olduğundan, uyumluluk, Java'da alt çizginin bu role hizmet edebileceği yere ulaşmak için daha dolaylı bir yol izlememizi gerektirdi. Aşama 1, Java 8'de bir lambda biçimsel parametre adı olarak alt çizgiyi yasaklıyordu (lambdalar daha önce mevcut olmadığı için bunun uyumlulukla ilgili bir sonucu yoktu) ve diğer yerlerde tanımlayıcı olarak alt çizginin kullanılması için bir uyarı yayınlandı. Faz 2, bu uyarı bir hata haline geldiğinde Java 9'da geldi. Artık kullanılmayan bir lambda, yöntem veya resmi bir parametre yakalamak için planlanan alt çizginin rehabilitasyonunu tamamlama özgürlüğüne sahibiz.



Tamam, ama J8'de kullanılmayan parametreleri göstermenin alternatifi nedir? Bu hiç mümkün değil mi?
Manuel

1
Şu anda $bu amaçla kullanıyoruz.
aventurin

1
Şu anda Java 14 kullanıyorum ve hala adsız lambda parametresi olarak bir alt çizgi kullanamıyorum. JCP neyi başarmak için yola çıkarsa çıksın, tam tersini başardıkları görülüyor.
Frans

1
@Frans JEP'in (bugün itibariyle) sadece aday aşamada olduğunu unutmayın. Henüz tamamlanmadı. JEP süreci hakkında daha fazla ayrıntı için bkz.JEP 1
Alexandre de Champeaux

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.