คำนำ
ไม่ต้องสงสัยเลยว่า Java 8 เป็นรุ่นที่สำคัญที่สุดของ Java ตั้งแต่ Java 5 (เปิดตัวในปี 2004) รุ่นนี้มีคุณสมบัติใหม่มากกว่าหนึ่งโหลในภาษาคอมไพเลอร์ไลบรารีเครื่องมือและ JVM
Java 8 เป็น Java รุ่นสำคัญ บางคนเชื่อว่าแม้ว่านักพัฒนา Java จะคาดหวังคุณสมบัติใหม่เหล่านี้ แต่ก็ต้องใช้ความพยายามอย่างมากในการเรียนรู้ ด้านล่างของบทความนี้จะแนะนำรายละเอียดของคุณสมบัติใหม่ที่เป็นตัวเลือกวิธีการเริ่มต้นและวิธีการคงที่ใน Java 8 โดยไม่ต้องกังวลใจเพิ่มเติมลองมาดูการแนะนำรายละเอียด
ไม่จำเป็น
คลาสเพิ่มเติม ( java.util.Optional ) เป็นคลาสคอนเทนเนอร์ที่แสดงถึงว่ามีค่าอยู่หรือไม่มีอยู่จริง มันใช้ในการใช้ null เพื่อระบุว่าไม่มีค่า ตอนนี้ทางเลือกสามารถแสดงแนวคิดนี้ได้ดีขึ้น และสามารถหลีกเลี่ยงข้อยกเว้นตัวชี้ว่าง
วิธีการทั่วไป:
Optional.of(T t) : สร้างอินสแตนซ์เสริมOptional.empty() : สร้างอินสแตนซ์เสริมที่ว่างเปล่าOptional.ofNullable(T t) ถ้า t ไม่เป็นโมฆะให้สร้างอินสแตนซ์ที่เป็นตัวเลือกมิฉะนั้นสร้างอินสแตนซ์ที่ว่างเปล่าisPresent() : กำหนดว่ารวมค่าไว้หรือไม่orElse(T t) : ส่งคืนค่าหากวัตถุโทรมีค่ามิฉะนั้นจะส่งคืน torElseGet(Supplier s) : ส่งคืนค่าหากวัตถุการโทรมีค่ามิฉะนั้นจะส่งคืนค่าที่ได้รับโดย smap(Function f) หากมีค่าในการประมวลผลและส่งคืนตัวเลือกที่ผ่านการประมวลผลมิฉะนั้นจะส่งคืน Optional.empty()flatMap(Function mapper) คล้ายกับ MAP ซึ่งต้องการให้ค่าส่งคืนต้องเป็นทางเลือกต่อไปนี้เป็นย่อหน้าจาก ImportNew เพื่อบอกเราว่าจะใช้ทางเลือกได้อย่างถูกต้อง ตัวอย่างเช่นอย่าเขียนแบบนี้:
สตริงคงที่สาธารณะ getName (ผู้ใช้ u) {ตัวเลือก <user> user = poiceal.ofnullable (u); if (! user.ispresent ()) ส่งคืน "ไม่ทราบ"; return user.get (). name;}การเขียนใหม่นี้ไม่เพียง แต่ไม่กระชับ แต่การดำเนินการก็เหมือนกับรหัสชิ้นแรก มันไม่มีอะไรมากไปกว่าการใช้วิธี ispresent เพื่อแทนที่ u == null การเขียนใหม่ดังกล่าวไม่ใช่การใช้งานที่ถูกต้องของตัวเลือกให้เขียนใหม่อีกครั้ง
สตริงคงที่สาธารณะ getName (ผู้ใช้ u) {return pontainal.ofnullable (u) .map (user-> user.name) .orelse ("ไม่ทราบ");}นี่เป็นวิธีที่ถูกต้องในการใช้เป็นทางเลือก จากนั้นตามความคิดนี้เราสามารถโทรออกโซ่ด้วยความอุ่นใจของจิตใจแทนที่จะทำการตัดสินเลเยอร์ด้วยเลเยอร์ ดูรหัสชิ้นหนึ่ง:
สตริงคงที่สาธารณะ getChampionName (การแข่งขัน comp) พ่น unglegalargumentException {ถ้า (comp! = null) {instresult result = comp.getResult (); if (ผลลัพธ์! = null) {user Champion = result.getChampion (); ถ้า (แชมป์! = null) {return Champion.getName (); }}} โยน unglemalargumentException ใหม่ ("ค่าของ param comp ไม่พร้อมใช้งาน");} เนื่องจากเหตุผลต่าง ๆ (เช่น: การแข่งขันยังไม่ได้สร้างการแข่งขันชิงแชมป์การโทรผิดปกติไปยังวิธีการแพคเกจของขวัญขนาดใหญ่ที่ฝังอยู่ในการดำเนินการตามวิธีการบางอย่าง ฯลฯ ) เราไม่สามารถไป comp.getResult().getChampion().getName() ภาษาอื่น ๆ เช่น Kotlin ให้พรผู้ประกอบการในระดับไวยากรณ์: comp?.getResult()?.getChampion()?.getName() ?
มาดูกันว่ารหัสเหล่านี้จะเป็นอย่างไรหลังจากการสนับสนุนเสริม
สตริงคงที่สาธารณะ getChampionName (การแข่งขัน comp) พ่น unledalargumentexception {return ondental.ofnullable (comp) .map (c-> c.getResult ()) .map (r-> r.getChampion ()) .MAP (u-> u-getName ().นี่คือความสะดวกสบายมาก เสน่ห์ของตัวเลือกมากกว่านั้น ตัวเลือกยังมีการใช้งานที่มีมนต์ขลังเช่นตัวเลือกที่สามารถใช้ในการทดสอบความถูกต้องตามกฎหมายของพารามิเตอร์
โมฆะสาธารณะ setName (ชื่อสตริง) พ่น unledalArgumentException {this.name = poiceal.ofnullable (ชื่อ). filter (ผู้ใช้ :: isnamevalid) .orelsethrow (()-> ใหม่ lellegalargumentException ("ชื่อผู้ใช้ที่ไม่ถูกต้อง"));};รหัสด้านบนอ้างอิง ImportNew - Java8 วิธีใช้ทางเลือกอย่างถูกต้อง
วิธีการเริ่มต้นและคงที่ในอินเทอร์เฟซ
วิธีการคงที่สามารถเพิ่มลงในอินเตอร์เฟส Java8 หรือวิธีเริ่มต้นสามารถเพิ่มได้และวิธีการเริ่มต้นจะถูกแก้ไขด้วยค่าเริ่มต้น
ความสนุกอินเตอร์เฟสสาธารณะ <t> {เป็นโมฆะเริ่มต้น getName () {system.out.println ("Hello World"); } โมฆะคงที่ getage () {system.out.println ("เก้า"); -หากอินเทอร์เฟซกำหนดวิธีการเริ่มต้นคลาสพาเรนต์ของคลาสการใช้งานจะกำหนดวิธีการที่มีชื่อและรายการพารามิเตอร์เดียวกัน จากนั้นเมื่อมีการเรียกคลาสการใช้งานวิธีการในคลาสพาเรนต์จะถูกดำเนินการ
ระดับสาธารณะ testf {โมฆะสาธารณะ getName () {system.out.println ("testf"); }} อินเตอร์เฟสสาธารณะ testInterface {เป็นโมฆะเริ่มต้น getName () {system.out.println ("Hello World"); }} การทดสอบระดับสาธารณะขยาย TestF ดำเนินการ testinterface {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ทดสอบ t = การทดสอบใหม่ (); t.getName (); // เอาต์พุตเป็น testf}}หากคลาสการใช้งานใช้อินเทอร์เฟซสองแบบหากอินเทอร์เฟซพาเรนต์ตัวหนึ่งให้วิธีการเริ่มต้นและอินเทอร์เฟซพาเรนต์อื่น ๆ ยังให้วิธีการที่มีชื่อและรายการพารามิเตอร์เดียวกัน (ไม่ว่าวิธีการนั้นจะเป็นวิธีเริ่มต้น) วิธีการจะต้องถูกแทนที่เพื่อแก้ไขข้อขัดแย้งมิฉะนั้นจะมีการรายงานข้อผิดพลาด
อินเตอร์เฟสสาธารณะ testinterface {เป็นโมฆะเริ่มต้น getName () {system.err.println ("Hello World"); }} อินเตอร์เฟสสาธารณะ testinterface1 {void getName ();} คลาสสาธารณะ test1 ใช้ testinterface, testinterface1 {โมฆะสาธารณะ getName () {system.out.println ("tes1f"); -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com