คอลเลกชัน Java ของคู่ค่าหรือไม่ (tuples?)


345

ฉันชอบวิธีที่ Java มีแผนที่ซึ่งคุณสามารถกำหนดประเภทของแต่ละรายการในแผนที่ได้ <String, Integer>ได้

สิ่งที่ฉันกำลังมองหาคือประเภทของคอลเลกชันที่แต่ละองค์ประกอบในคอลเลกชันเป็นคู่ของค่า แต่ละค่าในคู่สามารถมีชนิดของตัวเอง (เช่นตัวอย่าง String และ Integer ด้านบน) ซึ่งกำหนดไว้ในเวลาที่ประกาศ

คอลเลกชันจะรักษาลำดับที่ได้รับและจะไม่ถือว่าหนึ่งในค่าเป็นคีย์เฉพาะ (เช่นในแผนที่)

เป็นหลักฉันต้องการกำหนดประเภทของ ARRAY <String,Integer>หรือ 2 ประเภทอื่น ๆ

ฉันรู้ว่าฉันสามารถสร้างคลาสได้โดยไม่ต้องใช้อะไรนอกจากตัวแปร 2 ตัวในนั้น แต่ดูเหมือนว่า verbose มากเกินไป

ฉันยังตระหนักว่าฉันสามารถใช้อาร์เรย์ 2 มิติ แต่เนื่องจากประเภทที่แตกต่างกันที่ฉันต้องการใช้ฉันจะต้องทำให้อาร์เรย์ของวัตถุนั้นและจากนั้นฉันจะต้องโยนตลอดเวลา

ฉันต้องการเก็บคู่ในคอลเลกชันเท่านั้นดังนั้นฉันจึงต้องการเพียงสองค่าต่อรายการ มีบางสิ่งเช่นนี้อยู่โดยไม่ต้องไปตามเส้นทางชั้นเรียนหรือไม่? ขอบคุณ!


ฉันสงสัยว่า Guava อาจมีคลาสสำหรับสิ่งนี้ด้วย
Sikorski

ฝรั่งเป็นสารต้านสวยPairและคนที่ Google ได้ไปให้ไกลที่สุดเท่าที่จะสร้างทางเลือกที่ดีมาก - Auto / มูลค่า มันช่วยให้คุณสร้างคลาสประเภทค่าที่พิมพ์ได้อย่างง่ายดายด้วยซีแมนทิกส์เท่ากับ / hashCode ที่เหมาะสม คุณจะไม่ต้องPairพิมพ์อีกเลย!
dimo414

คำตอบ:


255

คลาส Pair เป็นหนึ่งในตัวอย่างทั่วไป "gimme" ที่ง่ายพอที่จะเขียนด้วยตัวคุณเอง ตัวอย่างเช่นปิดส่วนหัวของฉัน:

public class Pair<L,R> {

  private final L left;
  private final R right;

  public Pair(L left, R right) {
    assert left != null;
    assert right != null;

    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }

  @Override
  public int hashCode() { return left.hashCode() ^ right.hashCode(); }

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof Pair)) return false;
    Pair pairo = (Pair) o;
    return this.left.equals(pairo.getLeft()) &&
           this.right.equals(pairo.getRight());
  }

}

และใช่มันมีอยู่ในหลาย ๆ ที่บนเน็ตด้วยองศาที่สมบูรณ์และคุณสมบัติที่แตกต่างกัน (ตัวอย่างของฉันด้านบนมีจุดมุ่งหมายที่จะไม่เปลี่ยนรูป)


17
ฉันชอบสิ่งนี้ แต่คุณคิดอย่างไรเกี่ยวกับการทำให้ฟิลด์ด้านซ้ายและด้านขวาเป็นสาธารณะ เป็นที่ชัดเจนว่าคลาส Pair จะไม่เชื่อมโยงตรรกะใด ๆ และลูกค้าทุกคนจะต้องเข้าถึง 'ซ้าย' และ 'ถูกต้อง' ดังนั้นทำไมไม่ทำให้มันง่าย?
Outlaw Programmer

43
อืม ... ไม่หรอก ฟิลด์ถูกทำเครื่องหมายว่าเป็นที่สุดดังนั้นจึงไม่สามารถกำหนดใหม่ได้ และมันไม่ได้เป็นเธรดที่ปลอดภัยเพราะ 'ซ้าย' และ 'ถูกต้อง' สามารถเปลี่ยนแปลงได้ เว้นแต่ว่า getLeft () / getRight () ส่งคืนสำเนาการป้องกัน (ไร้ประโยชน์ในกรณีนี้) ฉันไม่เห็นว่าเรื่องใหญ่คืออะไร
Outlaw Programmer

17
โปรดทราบว่า hashCode () ตามที่เป็นอยู่จะให้ค่าเดียวกันหากสลับซ้ายและขวา อาจจะ:long l = left.hashCode() * 2654435761L; return (int)l + (int)(l >>> 32) + right.hashCode();
karmakaze

68
ดังนั้นหากฉันเข้าใจอย่างถูกต้องการเปิดคลาสคู่อย่างง่ายทำให้เกิดข้อผิดพลาดทางไวยากรณ์วิธีการ subpar hashCode ข้อยกเว้นตัวชี้โมฆะไม่มีวิธีการเปรียบเทียบกับคำถามการออกแบบ ... และผู้คนยังคงสนับสนุนการเรียนในชั้นนี้ กรุณาคัดลอกรหัสถ้าคุณไม่ต้องการรวม JAR แต่หยุด reinventing ล้อ!
cquezel

38
คุณหมายถึง "ง่ายพอที่จะเขียนด้วยตัวคุณเอง"? นั่นคือวิศวกรรมซอฟต์แวร์ที่น่ากลัว คลาสอะแด็ปเตอร์ N ^ 2 ที่จะแปลงระหว่าง MyPair และ SomeoneElsesPair นั้นถือว่าง่ายพอที่จะเขียนด้วยตัวเองหรือไม่?
djechlin

299

AbstractMap.SimpleEntry

ง่ายที่คุณกำลังมองหาสิ่งนี้:

java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();

คุณเติมได้อย่างไร?

java.util.Map.Entry<String,Integer> pair1=new java.util.AbstractMap.SimpleEntry<>("Not Unique key1",1);
java.util.Map.Entry<String,Integer> pair2=new java.util.AbstractMap.SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

สิ่งนี้ทำให้ง่ายต่อการ:

Entry<String,Integer> pair1=new SimpleEntry<>("Not Unique key1",1);
Entry<String,Integer> pair2=new SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

และด้วยความช่วยเหลือของcreateEntryวิธีการสามารถลด verbosity เพื่อ:

pairList.add(createEntry("Not Unique key1", 1));
pairList.add(createEntry("Not Unique key2", 2));

เนื่องจากArrayListไม่ใช่ขั้นตอนสุดท้ายจึงสามารถ subclassed เพื่อแสดงofวิธีการ (และcreateEntryวิธีการดังกล่าวข้างต้น) ทำให้เกิดข้อสรุปทางไวยากรณ์:

TupleList<java.util.Map.Entry<String,Integer>> pair = new TupleList<>();
pair.of("Not Unique key1", 1);
pair.of("Not Unique key2", 2);

11
FYI: สิ่งที่แนะนำSimpleEntryนั้นมีsetValueวิธีการละเว้นคลาสพี่น้องที่ไม่เปลี่ยนรูป SimpleImmutableEntryดังนั้นชื่อ
Basil Bourque

3
สิ่งนี้ดีกว่าการใช้งานตนเอง ความจริงที่ว่ามันใช้งานง่ายไม่ใช่ข้อแก้ตัวในการนำไปใช้ในแต่ละครั้ง
pevogam

6
ฉันไม่คิดว่ามันเป็น "มาตรฐาน" Entryมีความหมายว่าเป็นคู่ของคีย์ - ค่าและใช้ได้ดี แต่มันมีจุดอ่อนเหมือน tuple จริง ตัวอย่างเช่นhashcodeการดำเนินงานในSimpleEntryเพียง xors รหัสขององค์ประกอบเพื่อ<a,b>hashes <b,a>เพื่อค่าเช่นเดียวกับ การใช้งาน tuple มักจะเรียงลำดับ lexicographically แต่ไม่ใช้SimpleEntry Comparableดังนั้นจงระวังที่นั่น ...
ยีน

167

Java 9+

ใน Java 9 คุณสามารถเขียน: Map.entry(key, value) เพื่อสร้างคู่ที่ไม่เปลี่ยนรูปได้

หมายเหตุ:วิธีนี้ไม่อนุญาตให้ใช้คีย์หรือค่าเป็นโมฆะ หากคุณต้องการที่จะให้ค่า null Map.entry(key, Optional.ofNullable(value))ตัวอย่างเช่นคุณต้องการที่จะเปลี่ยนนี้ไปที่:


Java 8+

ใน Java 8 คุณสามารถใช้วัตถุประสงค์ทั่วไปมากขึ้นjavafx.util.Pairเพื่อสร้างคู่ที่ไม่เปลี่ยนรูปแบบและไม่เปลี่ยนแปลง คลาสนี้อนุญาตให้ใช้คีย์ที่ไม่มีค่าและค่าว่าง (ใน Java 9 คลาสนี้รวมอยู่ในjavafx.baseโมดูล) แก้ไข: ตั้งแต่วันที่ Java 11, JavaFX ได้รับการแยกออกจาก JDK ดังนั้นคุณต้องมีสิ่งประดิษฐ์ maven เพิ่มเติม org.openjfx: javafx-base


Java 6+

ใน Java 6 และสูงกว่าคุณสามารถใช้ verbose เพิ่มเติมAbstractMap.SimpleImmutableEntryสำหรับคู่ที่ไม่เปลี่ยนรูปหรือAbstractMap.SimpleEntryสำหรับคู่ที่สามารถเปลี่ยนค่าได้ คลาสเหล่านี้ยังอนุญาตให้มีคีย์ Null และค่า Null และสามารถจัดลำดับได้


Android

หากคุณกำลังเขียนสำหรับ Android เพียงใช้Pair.create(key, value)เพื่อสร้างคู่ที่ไม่เปลี่ยนรูป


Apache Commons

Apache Commons Langให้ประโยชน์Pair.of(key, value)ในการสร้างคู่ที่ไม่เปลี่ยนรูปเทียบเคียงและเทียบเคียงได้


Eclipse Collections

หากคุณกำลังใช้คู่ที่มีการดึกดำบรรพ์Eclipse Collectionsมีคลาสการจับคู่แบบดั้งเดิมที่มีประสิทธิภาพมากซึ่งจะช่วยหลีกเลี่ยงการชกมวยอัตโนมัติที่ไม่มีประสิทธิภาพและการยกเลิกการทำกล่องอัตโนมัติ

ตัวอย่างเช่นคุณสามารถใช้PrimitiveTuples.pair(int, int)ในการสร้างIntIntPairหรือการสร้างPrimitiveTuples.pair(float, long)FloatLongPair


โครงการลอมบอก

การใช้โปรเจ็กต์ลอมบอกคุณสามารถสร้างคลาสคู่ที่ไม่เปลี่ยนรูปได้ง่ายๆโดยการเขียน:

@Value
public class Pair<K, V> {
    K key;
    V value;
}

ลอมบอกจะเติมในตัวสร้าง, getters ที่equals(), hashCode()และtoString()วิธีการให้คุณโดยอัตโนมัติใน bytecode สร้าง หากคุณต้องการวิธีการที่โรงงานคงแทนนวกรรมิกเช่นเป็นเพียงแค่เปลี่ยนคำอธิบายประกอบเพื่อ:Pair.of(k, v)@Value(staticConstructor = "of")


มิฉะนั้น

หากไม่มีวิธีแก้ไขปัญหาข้างต้นลอยเรือของคุณคุณสามารถคัดลอกและวางรหัสต่อไปนี้ (ซึ่งแตกต่างจากชั้นเรียนที่ระบุไว้ในคำตอบที่ได้รับการยอมรับป้องกัน NullPointerExceptions):

import java.util.Objects;

public class Pair<K, V> {

    public final K key;
    public final V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public boolean equals(Object o) {
        return o instanceof Pair && Objects.equals(key, ((Pair<?,?>)o).key) && Objects.equals(value, ((Pair<?,?>)o).value);
    }

    public int hashCode() {
        return 31 * Objects.hashCode(key) + Objects.hashCode(value);
    }

    public String toString() {
        return key + "=" + value;
    }
}

3
JavaFX เป็นแบบเดสก์ท็อปเท่านั้นโดยเพิ่มการพึ่งพาที่ไม่จำเป็นสำหรับสภาพแวดล้อมที่ไม่ใช่เดสก์ทอป (เช่นเซิร์ฟเวอร์)
foo

2
คราสคอลเลกชันนี้ยังมีPairอินเตอร์เฟซสำหรับวัตถุซึ่งสามารถ instantiated Tuples.pair(object1, object2)โดยโทร eclipse.org/collections/javadoc/9.2.0/org/eclipse/collections/...
Donald Raab

2
นี่ให้ความรู้สึกเหมือนคำตอบที่แท้จริงของ Java การใช้งานที่มีอยู่ทั้งหมด ละเอียดมากขอบคุณมาก!
ไมค์

สวัสดี @Hans List<Pair<Integer, String> listOfTupleฉันใช้รายการ ฉันจะใช้งานlistOfTuple.add()อย่างไร ถ้าฉันจะทำ - listOfTuple.add(Pair<someInteger, someString>);สิ่งนี้จะไม่ทำงาน ขอบคุณล่วงหน้า.
Me_developer

เวอร์ชัน android ไม่สามารถใช้งานได้ในการทดสอบหน่วยซึ่งทำให้มันไม่มีประโยชน์จริง ๆ ...
4327

65

Map.Entry

คลาสในตัวเหล่านี้เป็นตัวเลือกด้วย ทั้งสองใช้Map.Entryอินเตอร์เฟส

แผนภาพ UML ของ Map.Entry อินเตอร์เฟสพร้อมคู่ของคลาสที่ใช้


10
พวกเขาไม่ใช่แค่ตัวเลือก แต่เป็นคำตอบที่ถูก ฉันคิดว่าบางคนชอบที่จะประดิษฐ์ล้อ
CurtainDog

31

Apache ทั่วไป lang3 มีคลาส Pair และไลบรารีอื่น ๆ อีกไม่กี่ที่กล่าวถึงในเธรดนี้ค่าเทียบเท่าของ C ++ Pair <L, R> ใน Java คืออะไร

ตัวอย่างที่ตรงกับความต้องการจากคำถามเดิมของคุณ:

List<Pair<String, Integer>> myPairs = new ArrayList<Pair<String, Integer>>();
myPairs.add(Pair.of("val1", 11));
myPairs.add(Pair.of("val2", 17));

//...

for(Pair<String, Integer> pair : myPairs) {
  //following two lines are equivalent... whichever is easier for you...
  System.out.println(pair.getLeft() + ": " + pair.getRight());
  System.out.println(pair.getKey() + ": " + pair.getValue());
}

1
นี่เป็นตัวเลือกที่ง่ายที่สุดหาก Apache Commons พร้อมใช้งาน
กีบ


15

แล้วPairคลาส"Apache Commons Lang 3" และคลาสย่อยสัมพันธ์ล่ะ

    import org.apache.commons.lang3.tuple.ImmutablePair;
    import org.apache.commons.lang3.tuple.Pair;
    ...
    @SuppressWarnings("unchecked")
    Pair<String, Integer>[] arr = new ImmutablePair[]{
            ImmutablePair.of("A", 1),
            ImmutablePair.of("B", 2)};

    // both access the 'left' part
    String key = arr[0].getKey();
    String left = arr[0].getLeft();

    // both access the 'right' part
    Integer value = arr[0].getValue();
    Integer right = arr[0].getRight();

ImmutablePairเป็นคลาสย่อยเฉพาะที่ไม่อนุญาตให้ค่าในคู่ที่จะแก้ไข แต่มีการใช้งานอื่น ๆ ที่มีความหมายแตกต่างกัน นี่คือพิกัด Maven หากคุณต้องการ

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

11

คุณสามารถเขียนคลาสคู่ <A, B> และใช้สิ่งนี้ในอาร์เรย์หรือรายการ ใช่คุณต้องเขียนคลาส แต่คุณสามารถนำคลาสเดิมกลับมาใช้ใหม่ได้ทุกประเภทดังนั้นคุณต้องทำเพียงครั้งเดียว


ฉันชอบที่จะเห็นตัวอย่างของที่!
DivideByHero

1
แดนสิ่งที่ไม่ดีเกี่ยวกับเรื่องนี้คือเป็นไปไม่ได้ที่จะยอมรับเช่นคู่เท่านั้น <String, จำนวนเต็ม> เนื่องจากการลบประเภทใช่ไหม? แต่เพื่อให้เป็น Java ...
ฮันเนสไวส์

โยฮันเนสที่น่าสนใจ java.sun.com/docs/books/tutorial/java/generics/erasure.html
JMD

ฉันไม่คิดว่ามันจะใช้งานได้กับอาร์เรย์ธรรมดา แต่จะใช้กับคอลเลกชันอื่น ๆ ได้แน่นอน
Outlaw Programmer

@Outlaw โปรแกรมเมอร์: ข้อดีคุณสามารถใช้กับอาร์เรย์ แต่มันน่าเกลียดเพราะคุณต้องใช้แฮ็คเพื่อสร้างอาร์เรย์ทั่วไป
Dan Dyer

7

การขยายคำตอบอื่น ๆ คู่ที่ไม่เปลี่ยนรูปแบบทั่วไปควรมีวิธีการแบบคงที่เพื่อหลีกเลี่ยงความยุ่งเหยิงโค้ดของคุณด้วยการเรียกไปยังตัวสร้าง:

class Pair<L,R> {
      final L left;
      final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      static <L,R> Pair<L,R> of(L left, R right){
          return new Pair<L,R>(left, right);
      }
}

หากคุณตั้งชื่อวิธีการคงที่ "ของ" หรือ "pairOf" รหัสจะคล่องแคล่วในขณะที่คุณสามารถเขียน:

    list.add(Pair.of(x,y)); // my preference
    list.add(pairOf(x,y)); // use with import static x.y.Pair.pairOf

มันเป็นความอัปยศจริง ๆ ที่ห้องสมุดหลักของจาวานั้นกระจัดกระจายอยู่ในสิ่งต่าง ๆ ที่คุณต้องใช้คอมมอนส์ - แลงหรือบุคคลที่สามอื่น ๆ เพื่อทำสิ่งพื้นฐาน อีกเหตุผลหนึ่งในการอัปเกรดเป็นสกาล่า ...


6

ฉันจะถามว่าคุณไม่ต้องการใช้List<Pair<T, U>>หรือไม่? แต่แน่นอน JDK ไม่มีคลาส Pair <> แต่อย่างรวดเร็ว Google พบว่าหนึ่งทั้งในวิกิพีเดียและforums.sun.com ไชโย


6

โซลูชันที่ต้องการตามที่คุณอธิบายไว้คือ List of Pairs (เช่น List)

ในการทำสิ่งนี้ให้สำเร็จคุณจะสร้างคลาส Pair สำหรับใช้ในคอลเลกชันของคุณ นี่คือคลาสยูทิลิตี้ที่มีประโยชน์ในการเพิ่มรหัสฐานของคุณ

คลาสที่ใกล้เคียงที่สุดใน Sun JDK ที่มีฟังก์ชันการทำงานคล้ายกับคลาส Pair ทั่วไปคือ AbstractMap.SimpleEntry คุณสามารถใช้คลาสนี้แทนการสร้างคลาส Pair ของคุณเองแม้ว่าคุณจะต้องใช้ชีวิตด้วยข้อ จำกัด ที่น่าอึดอัดใจและฉันคิดว่าคนส่วนใหญ่จะขมวดคิ้วในเรื่องนี้เพราะไม่ใช่บทบาทที่แท้จริงของ SimpleEntry ตัวอย่างเช่น SimpleEntry ไม่มีเมธอด "setKey ()" และไม่มีคอนสตรัคเตอร์เริ่มต้นดังนั้นคุณอาจพบว่ามัน จำกัด เกินไป

โปรดทราบว่าคอลเล็กชันได้รับการออกแบบให้มีองค์ประกอบประเภทเดียว อินเตอร์เฟสยูทิลิตี้ที่เกี่ยวข้องเช่น Map ไม่ใช่คอลเล็กชันจริง (เช่น Map ไม่ได้ใช้อินเตอร์เฟสการรวบรวม) Pair จะไม่ใช้อินเตอร์เฟสการรวบรวม แต่เห็นได้ชัดว่าเป็นคลาสที่มีประโยชน์ในการสร้างโครงสร้างข้อมูลขนาดใหญ่


ฉันพบว่าวิธีการแก้ปัญหานี้ดีกว่า "ผู้ชนะ" ด้วยคู่ทั่วไป <K, V> มันทำทุกอย่างที่ร้องขอและออกมาจากกล่อง ฉันใช้อันนี้เพื่อการใช้งานของฉัน
ซาวเออร์

5

สิ่งนี้เป็นไปตามโค้ดของ JavaHelp4u

แสดงรายละเอียดน้อยลงและแสดงวิธีการในหนึ่งบรรทัดและวิธีวนรอบสิ่งต่าง ๆ

//======>  Imports
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

//======>  Single Entry
SimpleEntry<String, String> myEntry = new SimpleEntry<String, String>("ID", "Text");
System.out.println("key: " + myEntry.getKey() + "    value:" + myEntry.getValue());
System.out.println();

//======>  List of Entries
List<Entry<String,String>> pairList = new ArrayList<>();

//-- Specify manually
Entry<String,String> firstButton = new SimpleEntry<String, String>("Red ", "Way out");
pairList.add(firstButton);

//-- one liner:
pairList.add(new SimpleEntry<String,String>("Gray", "Alternate route"));  //Ananomous add.

//-- Iterate over Entry array:
for (Entry<String, String> entr : pairList) {
    System.out.println("Button: " + entr.getKey() + "    Label: " + entr.getValue());
}


4

เพียงแค่สร้างคลาสเช่น

class tuples 
{ 
int x;
int y;
} 

จากนั้นสร้างรายการของวัตถุของสิ่งอันดับ

List<tuples> list = new ArrayList<tuples>();

เพื่อให้คุณสามารถใช้โครงสร้างข้อมูลใหม่อื่น ๆ ในลักษณะเดียวกัน


4

ฉันหมายถึงแม้ว่าจะไม่มีPairคลาสใน Java แต่ก็มีบางอย่างที่ค่อนข้างคล้ายกัน:Map.Entry

Map.Entry Documentation

นี่คือ (ลดความซับซ้อนเล็กน้อย) สิ่งที่HashMapจริงหรือMapร้านค้าใด ๆ

คุณสามารถสร้างอินสแตนซ์ของการMapจัดเก็บค่าของคุณในนั้นและรับชุดรายการ คุณจะจบลงด้วยการSet<Map.Entry<K,V>>ที่มีประสิทธิภาพเป็นสิ่งที่คุณต้องการ

ดังนั้น:

public static void main(String []args)
{    
    HashMap<String, Integer> values = new HashMap<String,Integer>();
    values.put("A", 235);//your custom data, the types may be different
    //more data insertions....
    Set<Map.Entry<String,Integer>> list = values.entrySet();//your list 
    //do as you may with it
}

ตัวเลือกนี้มีปัญหาของคีย์ที่ไม่ซ้ำกัน สมมติว่าคุณมีคุณลักษณะของบุคคล (เช่น {(person1, "blue-eyed"), (person1, "ผมสีแดง", (person2, "shortighted"), (person2, "quick-thinker")} คุณจะ ไม่สามารถเก็บไว้เป็นคู่ในแผนที่ได้เนื่องจากแต่ละคนเป็นกุญแจสำคัญในแผนที่และอนุญาตให้ใช้คุณลักษณะหนึ่งรายการต่อคนเท่านั้น
manuelvigarcia


0

สิ่งที่เกี่ยวกับ com.sun.tools.javac.util.Pair?


7
ประเภทนี้อยู่ใน tools.jar - ส่วนหนึ่งของการใช้งาน "Sun" ของคอมไพเลอร์ javac มีการแจกจ่ายโดยเป็นส่วนหนึ่งของ JDK เท่านั้นอาจไม่ปรากฏในการนำไปใช้ของผู้ขายรายอื่นและไม่น่าจะเป็นส่วนหนึ่งของ API สาธารณะ
McDowell


0

ใน Project Reactor (io.projectreactor: reactor-core) มีการรองรับขั้นสูงสำหรับ n-Tuples:

Tuple2<String, Integer> t = Tuples.of("string", 1)

ที่นั่นคุณสามารถได้รับt.getT1(), t.getT2(), ...โดยเฉพาะกับ Stream หรือ Flux คุณสามารถแมปองค์ประกอบ tuple:

Stream<Tuple2<String, Integer>> s;
s.map(t -> t.mapT2(i -> i + 2));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.