ฉันจะไม่เขียนส่วนไวยากรณ์เรามาถามคำถามที่เป็นประโยชน์เพื่อดูว่าคุณลักษณะใหม่ ๆ ของ Java8 สามารถนำมาให้เราได้อย่างไร
โดยวิธีการที่ใช้การเขียนโปรแกรมทั่วไปบางอย่างทุกอย่างคือการทำให้รหัสง่ายขึ้น
ฉาก:
คลาสข้อมูลที่บันทึกข้อมูลพนักงาน
พนักงานชั้นเรียนสาธารณะ {ชื่อสตริงสาธารณะ; อายุ int สาธารณะ; เซ็กส์ถ่านสาธารณะ; เวลาสตริงสาธารณะ เงินเดือนสาธารณะสาธารณะ}เรามีคอลัมน์ของข้อมูลประเภทนี้
รายการ <SPOTHEREE> data = array.aslist (e1, e2, e3 ...... )
มีความจำเป็นในขณะนี้: พนักงานกลุ่มพนักงานโดยจดหมายเริ่มต้นของชื่อของพวกเขา (สมมติว่าพวกเขาเป็นชื่อภาษาอังกฤษทั้งหมด):
จากนั้นผลลัพธ์ที่เราต้องการได้รับควรเป็นความสัมพันธ์การแมปเช่น Map:char -> List<Employee>
แผนที่สาธารณะคงที่ <อักขระ, รายการ <พนักงาน >> groupByFirstChar (รายการ <preatee> ข้อมูล) {แผนที่ <อักขระ, รายการ <พนักงาน >> result = new hashmap <> (); สำหรับ (พนักงาน e: data) {อักขระ c = e.name.charat (0); รายการ <Spop อยู่> l = result.get (c); if (l == null) {l = new ArrayList <> (); result.put (C, L); } l.add (e); } ผลตอบแทนผลลัพธ์;}รหัสไม่ซับซ้อนและสามารถทำให้เสร็จในไม่ช้า เจ้านายเห็นว่าคุณมีประสิทธิภาพมากดังนั้นเขาจึงบอกว่าคุณจะแบ่งมันออกเป็นกลุ่มตามเงินเดือนของคุณสำหรับผู้ที่ต่ำกว่า 5,000, 5,000 ~ 10,000 ... ฯลฯ
มันจะไม่ยากเกินไปเพียงแค่เปลี่ยนคีย์และประมวลผลอย่างมีเหตุผลเล็กน้อย
แผนที่สาธารณะคงที่ <สตริง, รายการ <พนักงาน >> GroupBySalary (รายการ <SpoverE> ข้อมูล) {แผนที่ <สตริง, รายการ <พนักงาน >> ผลลัพธ์ = new HashMap <> (); สำหรับ (พนักงาน E: data) {String key = แยก (E.Salary); รายการ <Spop อยู่> l = result.get (คีย์); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.add (e); } ผลตอบแทนผลลัพธ์; <br>} สตริงสแตติกส่วนตัวแยกต่างหาก (เงินเดือน int) {ถ้า (เงินเดือน <= 5000) {return "น้อยกว่า 5,000"; } if (เงินเดือน <= 10,000) {return "5000 ~ 10,000"; } if (เงินเดือน <= 20000) {return "10,000 ~ 20000"; } return "เหนือ 20000"}จากนั้นเจ้านายก็พูดอีกครั้งให้แบ่งพนักงานออกเป็นกลุ่มตามปีการจ้างงานของพวกเขา - -
ฉันจะไม่เขียนรหัสที่นี่ หากคุณเปรียบเทียบคุณจะพบว่าไม่ว่าคุณจะจัดกลุ่มอย่างไรการเปลี่ยนแปลงเพียงอย่างเดียวคือวิธีเลือกค่าคีย์
ตัวอักษรตัวแรกของชื่อพนักงานใช้เป็นกุญแจสำคัญเป็นครั้งแรก:
พนักงาน e -> e.name.charat (0)
ครั้งที่สองที่ฉันแปลงเงินเดือนของพนักงานเป็นสตริงเป็นคีย์ตามวิธีการแยก:
พนักงาน E -> แยก (E.Salary): String
และอื่น ๆ
พนักงาน E -> getYear (E.Time): String
ในความเป็นจริงครั้งแรกที่คุณสามารถเขียนจดหมายฉบับแรกลงในวิธีเดียว
พนักงาน e -> getFirstchar (e.name): อักขระ
เพื่อให้ดูสวยงามยิ่งขึ้นเราสามารถพูดได้ว่าพารามิเตอร์ของทั้งสามวิธีถูกตั้งค่าให้กับพนักงาน วิธีการที่ร่างกายไม่ได้เขียน เฉพาะพารามิเตอร์และค่าส่งคืนที่แสดงไว้ที่นี่
พนักงาน e -> getFirstChar (e): ตัวละคร ENSIO
ด้านซ้ายของ -> คือพารามิเตอร์ทางด้านขวาของ: คือค่าส่งคืนและด้านขวาของ -> คือลายเซ็นของวิธีการ
จากนั้นเราจะนึกถึงการแยกส่วนที่เปลี่ยนแปลงเป็นพารามิเตอร์และชิ้นส่วนที่ไม่เปลี่ยนแปลงอื่น ๆ เป็นวิธีการของวิธีการดังนั้นเราจึงสามารถละเว้นรหัสที่ซ้ำกันได้ เห็นได้ชัดว่าส่วนที่เปลี่ยนแปลงคือวิธีการที่ระบุไว้ข้างต้นซึ่งแปลงพนักงาน e เป็นคีย์ แต่เรารู้ว่า Java ไม่สามารถผ่านวิธีการเป็นพารามิเตอร์ได้ อย่างไรก็ตามนี่ไม่ใช่ปัญหาสำหรับโปรแกรมเมอร์ที่มีประสบการณ์เล็กน้อย เราสามารถใช้อินเทอร์เฟซเพื่อให้บรรลุเป้าหมายของเราและในเวลาเดียวกันเราจะพบปัญหาอื่น ค่าส่งคืนของสามวิธีข้างต้นนั้นแตกต่างกันดังนั้นเราจึงต้องใช้ยาชื่อสามัญ:
Public Static <K> แผนที่ <k, รายการ <พนักงาน >> groupByKey (รายการ <SPERINEE> ข้อมูล, getKey <K> getKey) {แผนที่ <k, รายการ <พนักงาน >> result = new HashMap <> (); สำหรับ (พนักงาน E: data) {k key = getKey.getKey (e); รายการ <Spop อยู่> l = result.get (คีย์); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.add (e); } return result;} อินเตอร์เฟส getKey <K> {k getKey (พนักงาน e);}จากนั้นข้อกำหนดแรกข้างต้นสามารถรับรู้ได้ด้วยวิธีนี้
แผนที่ <อักขระ, รายการ <พนักงาน >> result = groupByKey (ข้อมูล, getKey ใหม่ <caricy> () {@Override อักขระสาธารณะ getKey (พนักงาน e) {e.name.charat (0);}});ข้อกำหนดที่สอง
แผนที่ <string, list <พนักงาน >> result = groupByKey (รายการ, ใหม่ getKey <String> () {@Override สาธารณะสตริง GetKey (พนักงาน E) {แยก (E.Salary);}});จะพบได้ว่าเราจำเป็นต้องเปลี่ยนพารามิเตอร์ทั่วไปและการใช้งานคลาสภายในที่ไม่ระบุชื่อ ปัญหาเดียวคือมันไม่สมจริงมากและรหัสประจำจำนวนมากสะท้อนให้เห็นโดยเฉพาะอย่างยิ่งในชั้นเรียนภายในที่ไม่ระบุชื่อ
ในความเป็นจริงเราสนใจเฉพาะพารามิเตอร์และค่าส่งคืนของคลาสภายในที่ไม่ระบุชื่อนี้และส่วนที่เหลือเป็นเพียงข้อกำหนดทางไวยากรณ์
Java8 เพิ่งเกิดขึ้นเพื่อให้เรามีวิธีที่ดีในการหลีกเลี่ยงกิจวัตรที่ซับซ้อน: การแสดงออกของแลมบ์ดาการใช้งานข้างต้นสามารถเขียนได้เป็น
แผนที่ <อักขระ, รายการ <พนักงาน >> resultByFirstChar = groupByKey (รายการ, e -> e.name.charat (0)); แผนที่ <สตริง, รายการ <พนักงาน >> resultBysalary = GroupByKey (รายการ, e -> แยก (E.Salary));
การแสดงออกของแลมบ์ดาแสดงเฉพาะสิ่งที่เราใส่ใจพารามิเตอร์และค่าส่งคืน ในเวลาเดียวกันเนื่องจากการอนุมานประเภทสามารถละเว้นประเภทพารามิเตอร์ได้ ไวยากรณ์เฉพาะจะไม่ถูกนำมาใช้ที่นี่ ข้อมูลจำนวนมากสามารถพบได้บนอินเทอร์เน็ต
พิเศษ:
หากคุณมีความเข้าใจที่ดีเกี่ยวกับทั่วไปวิธีการ GroupByKey สามารถเป็นบทสรุปได้อีก:
สาธารณะคงที่ <k, e> map <k, รายการ <e >> groupby (รายการ <? ขยาย e> data, ฟังก์ชัน <? super e,? ขยาย k> fun) {map <k, รายการ <e>> result = new hashmap <> (); สำหรับ (e e: data) {k k = fun.apply (e); <br> รายการ <e> l = result.get (k); if (l == null) {l = new ArrayList <> (); result.put (k, l); } l.add (e); } ส่งคืนผลลัพธ์; <br>}นอกจากนี้เรายังได้แยกชั้นพนักงานและผลประโยชน์ที่ชัดเจน
ฟังก์ชั่นอินเทอร์เฟซเป็นอินเทอร์เฟซที่เพิ่มเข้ามาใน Java8:
@functionalInterfacepublic ฟังก์ชัน <t, r> {r ใช้ (t t);}ป้อนประเภท T เพื่อกลับไปที่ R Type การรวมกันของการเขียนโปรแกรมทั่วไปและการเขียนโปรแกรมใช้งานได้ดีมาก แม้ว่าคุณสมบัติใหม่ของ Java8 ได้รับการวิพากษ์วิจารณ์จากการร้องเรียนหลายประเภท แต่ก็เป็นเรื่องดีที่จะนำประโยชน์มาให้เราได้รับประโยชน์มากขึ้น
หากคุณมีเวลาฉันจะแนะนำสตรีมซึ่งเป็นเครื่องมือที่ยอดเยี่ยมอีกอย่างสำหรับ Java8
ข้างต้นคือการประยุกต์ใช้การแสดงออกของแลมบ์ดาใน Java 8 และความรู้ที่เกี่ยวข้องทั่วไปบางอย่างที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!