การใช้ Pairs ใน Java

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