Pengenalan Javatuples

1. Gambaran keseluruhan

Tuple adalah kumpulan beberapa elemen yang mungkin saling berkaitan atau tidak. Dengan kata lain, tupel boleh dianggap sebagai objek tanpa nama.

Sebagai contoh, ["RAM", 16, "Astra"] adalah tuple yang mengandungi tiga elemen.

Dalam artikel ini, kita akan melihat perpustakaan yang sangat sederhana yang membolehkan kita bekerja dengan struktur data berdasarkan tuple, bernama javatuples .

2. Kelas Javatuples terbina dalam

Perpustakaan ini memberi kami sepuluh kelas berbeza yang mencukupi bagi kebanyakan keperluan kami yang berkaitan dengan tupel:

  • Unit
  • Berpasangan
  • Kembar tiga
  • Kuartet
  • Quintet
  • Sextet
  • Septet
  • Octet
  • Ennead
  • Dekad

Sebagai tambahan kepada kelas di atas, terdapat dua kelas tambahan, KeyValue dan LabelValue , yang memberikan fungsi yang serupa dengan Pair , tetapi berbeza dalam semantik.

Seperti di laman web rasmi, semua kelas di javatuples adalah jenis yang selamat dan tidak berubah . Setiap satu daripada alat kelas tuple yang Iterable , Serializable dan setanding antara muka.

3. Menambah Ketergantungan Maven

Mari tambahkan kebergantungan Maven ke pom.xml kami :

 org.javatuples javatuples 1.2 

Sila periksa repositori Central Maven untuk versi terkini.

4. Membuat Tuples

Membuat tuple sangat mudah. Kita boleh menggunakan pembina yang sesuai:

Pair pair = new Pair("A pair", 55);

Terdapat juga cara yang elegan dan semantik untuk membuat tuple:

Triplet triplet = Triplet.with("hello", 23, 1.2);

Kita juga boleh membuat tuple dari Iterable :

List listOfNames = Arrays.asList("john", "doe", "anne", "alex"); Quartet quartet = Quartet.fromCollection(collectionOfNames);

Harap maklum bahawa jumlah item dalam koleksi harus sesuai dengan jenis tuple yang ingin kami buat . Sebagai contoh, kita tidak dapat membuat Quintet menggunakan koleksi di atas kerana ia memerlukan tepat lima elemen. Perkara yang sama berlaku untuk kelas tuple lain yang mempunyai pesanan lebih tinggi daripada Quintet .

Walau bagaimanapun, kita dapat membuat tupel pesanan rendah seperti Pair atau Triplet menggunakan koleksi di atas, dengan menentukan indeks permulaan dalam kaedah fromIterable () :

Pair pairFromList = Pair.fromIterable(listOfNames, 2);

Kod di atas akan menghasilkan Pair yang mengandungi " anne " dan " alex ".

Tuples boleh dibuat dengan senang dari mana-mana array juga:

String[] names = new String[] {"john", "doe", "anne"}; Triplet triplet2 = Triplet.fromArray(names);

5. Mendapatkan Nilai dari Tuples

Setiap kelas dalam javatuples mempunyai kaedah getValueX () untuk mendapatkan nilai dari tupel, di mana X menentukan susunan elemen di dalam tuple. Seperti indeks dalam tatasusunan, nilai X bermula dari sifar.

Mari buat Kuartet baru dan dapatkan beberapa nilai:

Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); String name = quartet.getValue0(); Integer age = quartet.getValue2(); assertThat(name).isEqualTo("john"); assertThat(age).isEqualTo(32);

Seperti yang kita lihat, kedudukan " john " adalah sifar, " 72.5 " adalah satu, dan seterusnya.

Perhatikan bahawa kaedah getValueX () selamat untuk jenis. Ini bermaksud, tidak perlu pemutus.

Alternatif untuk ini adalah kaedah getValue (int pos) . Dibutuhkan kedudukan berasaskan sifar elemen untuk diambil. Kaedah ini tidak selamat untuk jenis dan memerlukan pemutaran eksplisit :

Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); String name = (String) quartet.getValue(0); Integer age = (Integer) quartet.getValue(2); assertThat(name).isEqualTo("john"); assertThat(age).isEqualTo(32);

Harap maklum bahawa kelas KeyValue dan LabelValue mempunyai kaedah yang sesuai getKey () / getValue () dan getLabel () / getValue () .

6. Menetapkan Nilai ke Tuples

Sama seperti getValueX () , semua kelas dalam javatuples mempunyai kaedah setAtX () . Sekali lagi, X adalah kedudukan berasaskan sifar untuk elemen yang ingin kita tetapkan:

Pair john = Pair.with("john", 32); Pair alex = john.setAt0("alex"); assertThat(john.toString()).isNotEqualTo(alex.toString());

Yang penting di sini ialah kaedah pengembalian setAtX () adalah jenis tuple itu sendiri. Ini kerana javatuples tidak berubah . Menetapkan sebarang nilai baru akan menjadikan instance asalnya tidak utuh.

7. Menambah dan Mengeluarkan Elemen dari Tuples

Kita boleh menambahkan elemen baru pada tupel dengan mudah. Walau bagaimanapun, ini akan menghasilkan tupel baru satu pesanan yang lebih tinggi dibuat:

Pair pair1 = Pair.with("john", 32); Triplet triplet1 = pair1.add("1051 SW"); assertThat(triplet1.contains("john")); assertThat(triplet1.contains(32)); assertThat(triplet1.contains("1051 SW"));

Jelas dari contoh di atas bahawa menambahkan satu elemen ke Pasangan akan membuat Triplet baru . Begitu juga, menambahkan satu elemen ke Triplet akan membuat Quartet baru .

The example above also demonstrates the use of contains() method provided by all the classes in javatuples. This is a really handy method for verifying if the tuple contains a given value.

It is also possible to add one tuple to another using the add() method:

Pair pair1 = Pair.with("john", 32); Pair pair2 = Pair.with("alex", 45); Quartet quartet2 = pair1.add(pair2); assertThat(quartet2.containsAll(pair1)); assertThat(quartet2.containsAll(pair2));

Note the use of containsAll() method. It will return true if all the elements of pair1 are present in quartet2.

By default, the add() method adds the element as a last element of the tuple. However, it is possible to add the element at a given position using addAtX() method, where X is the zero-based position where we want to add the element:

Pair pair1 = Pair.with("john", 32); Triplet triplet2 = pair1.addAt1("1051 SW"); assertThat(triplet2.indexOf("john")).isEqualTo(0); assertThat(triplet2.indexOf("1051 SW")).isEqualTo(1); assertThat(triplet2.indexOf(32)).isEqualTo(2);

This example adds the String at position 1, which is then verified by the indexOf() method. Please note the difference in order of the types for the Pair and the Triplet after the call to addAt1() method call.

We can also add multiple elements using any of add() or addAtX() methods:

Pair pair1 = Pair.with("john", 32); Quartet quartet1 = pair1.add("alex", 45); assertThat(quartet1.containsAll("alex", "john", 32, 45));

In order to remove an element from the tuple, we can use the removeFromX() method. Again, X specifies the zero-based position of the element to be removed:

Pair pair1 = Pair.with("john", 32); Unit unit = pair1.removeFrom0(); assertThat(unit.contains(32));

8. Converting Tuples to List/Array

We have already seen how to convert a List to a tuple. Let's now see hot to convert a tuple to a List:

Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); List list = quartet.toList(); assertThat(list.size()).isEqualTo(4);

It is fairly simple. The only thing to note here is that we will always get a List, even if the tuple contains the same type of elements.

Finally, let's convert the tuple to an array:

Quartet quartet = Quartet.with("john", 72.5, 32, "1051 SW"); Object[] array = quartet.toArray(); assertThat(array.length).isEqualTo(4);

Clear enough, the toArray() method always returns an Object[].

9. Conclusion

Dalam artikel ini, kami telah menjelajahi perpustakaan javatuples dan melihat kesederhanaannya. Ia memberikan semantik yang elegan dan sangat mudah digunakan.

Pastikan anda melihat kod sumber lengkap untuk artikel ini di GitHub. Kod sumber yang lengkap mengandungi sedikit lebih banyak contoh daripada yang dibahas di sini. Setelah membaca artikel ini, contoh tambahan harus cukup mudah difahami.