ฉันเพิ่งแทนที่s
นิพจน์แลมบ์ดาต่อไปนี้โดย_
:
s -> Integer.parseInt(s)
คอมไพเลอร์ Eclipse พูดว่า:
ไม่ควรใช้ '_' เป็นตัวระบุเนื่องจากเป็นคำหลักที่สงวนไว้ตั้งแต่ระดับแหล่งที่มา 1.8
ฉันไม่พบคำอธิบายใด ๆ ในโครงสร้างศัพท์ / คำหลักJLS §3.9
ฉันเพิ่งแทนที่s
นิพจน์แลมบ์ดาต่อไปนี้โดย_
:
s -> Integer.parseInt(s)
คอมไพเลอร์ Eclipse พูดว่า:
ไม่ควรใช้ '_' เป็นตัวระบุเนื่องจากเป็นคำหลักที่สงวนไว้ตั้งแต่ระดับแหล่งที่มา 1.8
ฉันไม่พบคำอธิบายใด ๆ ในโครงสร้างศัพท์ / คำหลักJLS §3.9
คำตอบ:
สถานที่ที่มองคือJLS §15.27.1 พารามิเตอร์ Lambda
เป็นข้อผิดพลาดเวลาคอมไพล์หากพารามิเตอร์แลมบ์ดามีชื่อ _ (นั่นคืออักขระขีดล่างเดียว)
ไม่สนับสนุนการใช้ชื่อตัวแปร _ ในบริบทใด ๆ เวอร์ชันในอนาคตของภาษาโปรแกรม Java อาจสงวนชื่อนี้เป็นคีย์เวิร์ดและ / หรือให้ความหมายพิเศษ
ดังนั้นข้อความ Eclipse จึงทำให้เข้าใจผิดโดยเฉพาะเมื่อมีการใช้ข้อความเดียวกันสำหรับทั้งสองกรณีเมื่อข้อผิดพลาดถูกสร้างขึ้นสำหรับพารามิเตอร์แลมบ์ดาหรือเมื่อมีการสร้างคำเตือนสำหรับ_
ตัวระบุอื่น ๆ
enum
และassert
เป็นตัวระบุทางกฎหมาย…
เป็นเฟส 2 ของJEP 302ซึ่งจะเพิ่มขีดล่างเป็นอักขระพิเศษเพื่อแสดงถึงพารามิเตอร์ที่ไม่ได้ใช้ในนิพจน์แลมบ์ดา
การรักษาขีดล่าง
ในหลายภาษาเป็นเรื่องปกติที่จะใช้เครื่องหมายขีดล่าง (
_
) เพื่อแสดงถึงพารามิเตอร์แลมบ์ดาที่ไม่มีชื่อ (และในทำนองเดียวกันสำหรับพารามิเตอร์วิธีการและพารามิเตอร์ข้อยกเว้น):
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
สิ่งนี้ช่วยให้สามารถตรวจสอบอาร์กิวเมนต์ที่ไม่ได้ใช้แบบคงที่ได้ดีขึ้นและยังอนุญาตให้ทำเครื่องหมายอาร์กิวเมนต์หลายรายการว่าไม่ได้ใช้ อย่างไรก็ตามเนื่องจากขีดล่างเป็นตัวระบุที่ถูกต้องใน Java 8 ความเข้ากันได้ทำให้เราต้องใช้เส้นทางทางอ้อมมากขึ้นในการไปยังจุดที่ขีดล่างสามารถให้บริการบทบาทนี้ใน Java ระยะที่ 1 ห้ามขีดล่างเป็นชื่อพารามิเตอร์ที่เป็นทางการแลมบ์ดาใน Java 8 (สิ่งนี้ไม่มีความเข้ากันได้เนื่องจากไม่มีแลมบ์ดามาก่อน) และมีการออกคำเตือนสำหรับการใช้ขีดล่างเป็นตัวระบุในที่อื่น ๆ เฟส 2 มาใน Java 9 เมื่อคำเตือนนี้กลายเป็นข้อผิดพลาด ขณะนี้เรามีอิสระที่จะดำเนินการฟื้นฟูสมรรถภาพตามแผนเพื่อระบุแลมบ์ดาวิธีการหรือพารามิเตอร์ที่เป็นทางการที่ไม่ได้ใช้
$
เพื่อการนี้
การเปลี่ยนแปลงภาษา Java สำหรับ Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
จาก Java 9 อักขระ _ ไม่สามารถใช้เป็นตัวระบุได้อีกต่อไปไม่ใช่เฉพาะในบริบทแลมบ์ดา
อักขระขีดล่างไม่ใช่ชื่อตามกฎหมาย
หากคุณใช้อักขระขีดล่าง ("_") ตัวระบุจะไม่สามารถคอมไพล์ซอร์สโค้ดของคุณได้อีกต่อไป
_
จะไม่อนุญาตให้ใช้เป็นชื่อตัวระบุทางกฎหมายใด ๆ และไม่เพียง แต่เป็นชื่อพารามิเตอร์แลมบ์ดาเท่านั้น สิ่งนี้ได้รับการแก้ไขในบิลด์