1. ภาพรวม
ในบทความนี้อย่างรวดเร็วเราหารือเกี่ยวกับแนวคิดการเขียนโปรแกรมที่มีประโยชน์อย่างมากที่รู้จักกันเป็นคู่ คู่เป็นวิธีที่สะดวกในการจัดการคีย์อย่างง่ายเพื่อเชื่อมโยงค่าและมีประโยชน์อย่างยิ่งเมื่อเราต้องการคืนค่าสองค่าจากวิธีการ
การใช้งานคู่อย่างง่ายมีอยู่ในไลบรารี Java หลัก นอกเหนือจากนั้นไลบรารีของบุคคลที่สามบางแห่งเช่น Apache Commons และ Vavr ได้เปิดเผยฟังก์ชันนี้ใน API ของตน
2. การใช้งาน Core Java
2.1. คู่ชั้น
คู่ระดับที่สามารถพบได้ในjavafx.utilแพคเกจ ตัวสร้างของคลาสนี้รับอาร์กิวเมนต์สองตัวคีย์และค่าที่สอดคล้องกัน:
Pair pair = new Pair(1, "One"); Integer key = pair.getKey(); String value = pair.getValue();
ตัวอย่างนี้แสดงการแม็พInteger to Stringอย่างง่ายโดยใช้แนวคิด Pair
ดังที่แสดงไว้คีย์ในอ็อบเจ็กต์คู่จะถูกเรียกโดยการเรียกใช้เมธอด getKey ()ในขณะที่ค่าถูกเรียกโดยการเรียกgetValue ()
2.2. AbstractMap.SimpleEntryและAbstractMap.SimpleImmutableEntry
SimpleEntryถูกกำหนดให้เป็นคลาสที่ซ้อนกันภายในคลาสAbstractMap ในการสร้างวัตถุประเภทนี้เราสามารถระบุคีย์และค่าให้กับตัวสร้าง:
AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry(1, "one"); Integer key = entry.getKey(); String value = entry.getValue();
คีย์และค่าสามารถเข้าถึงได้ผ่านวิธี getter และ setter มาตรฐาน
นอกจากนี้คลาสAbstractMapยังมีคลาสที่ซ้อนกันซึ่งแสดงถึงคู่ที่ไม่เปลี่ยนรูป: คลาสSimpleImmutableEntry :
AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");
สิ่งนี้ทำงานในลักษณะเดียวกับคลาสคู่ที่เปลี่ยนแปลงได้ยกเว้นค่าของคู่ที่ไม่สามารถเปลี่ยนแปลงได้ ความพยายามที่จะทำเช่นนั้นจะส่งผลให้UnsupportedOperationException
3. Apache คอมมอนส์
ในไลบรารี Apache Commons เราสามารถค้นหาคลาสPairในแพ็คเกจorg.apache.commons.lang3.tuple นี่เป็นคลาสนามธรรมดังนั้นจึงไม่สามารถสร้างอินสแตนซ์ได้โดยตรง
เราสามารถพบได้ที่นี่คลาสย่อยสองคลาส - แสดงถึงคู่ที่ไม่เปลี่ยนรูปและเปลี่ยนแปลงไม่ได้: Imm utablePairและMutablePair
การใช้งานทั้งสองสามารถเข้าถึงเมธอด getter / setter ของคีย์ / ค่า:
ImmutablePair pair = new ImmutablePair(2, "Two"); Integer key = pair.getKey(); String value = pair.getValue();
ไม่น่าแปลกใจที่ความพยายามที่จะเรียกใช้setValue ()บนImmutablePairส่งผลให้UnsupportedOperationException
แต่การดำเนินการนั้นถูกต้องทั้งหมดสำหรับการใช้งานที่ไม่แน่นอน:
Pair pair = new MutablePair(3, "Three"); pair.setValue("New Three");
4. Vavr
ในไลบรารี Vavr ฟังก์ชันการจับคู่มีให้โดยคลาสTuple2 ที่ไม่เปลี่ยนรูป:
Tuple2 pair = new Tuple2(4, "Four"); Integer key = pair._1(); String value = pair._2();
ในการนำไปใช้งานนี้เราไม่สามารถปรับเปลี่ยนออบเจ็กต์หลังการสร้างได้ดังนั้นวิธีการกลายพันธุ์จะส่งคืนอินสแตนซ์ใหม่ที่มีการเปลี่ยนแปลงที่ให้ไว้:
tuplePair = pair.update2("New Four");
5. ทางเลือก I - คลาสคอนเทนเนอร์ธรรมดา
ไม่ว่าจะโดยความชอบของผู้ใช้หรือในกรณีที่ไม่มีไลบรารีใด ๆ ดังกล่าวข้างต้นวิธีแก้ปัญหามาตรฐานสำหรับฟังก์ชันการจับคู่คือการสร้างคลาสคอนเทนเนอร์แบบง่ายที่รวมค่าส่งคืนที่ต้องการ
ข้อได้เปรียบที่ใหญ่ที่สุดที่นี่คือความสามารถในการระบุชื่อของเราซึ่งจะช่วยในการหลีกเลี่ยงการมีคลาสเดียวกันแทนอ็อบเจ็กต์โดเมนที่แตกต่างกัน
public class CustomPair { private String key; private String value; // standard getters and setters }
6. ทางเลือก II - อาร์เรย์
วิธีแก้ปัญหาทั่วไปอีกประการหนึ่งคือการใช้อาร์เรย์อย่างง่ายที่มีสององค์ประกอบเพื่อให้ได้ผลลัพธ์ที่คล้ายกัน:
private Object[] getPair() { // ... return new Object[] {key, value}; }
โดยทั่วไปคีย์จะอยู่ที่ดัชนีศูนย์ของอาร์เรย์ในขณะที่ค่าที่สอดคล้องกันจะอยู่ที่ดัชนีหนึ่ง
7. สรุป
ในบทช่วยสอนนี้เราได้กล่าวถึงแนวคิดของคู่ใน Java และการใช้งานที่แตกต่างกันใน Java หลักและไลบรารีของบุคคลที่สามอื่น ๆ
เช่นเคยคุณสามารถค้นหาโค้ดที่สนับสนุนบทช่วยสอนนี้ได้ใน GitHub