VAVR (sebelumnya dikenal sebagai Javaslang) adalah perpustakaan fungsional nirlaba untuk Java 8+. Ini memungkinkan Anda untuk menulis kode mirip Scala fungsional di Jawa dan berfungsi untuk mengurangi jumlah kode dan meningkatkan kualitasnya.
Situs perpustakaan .
Di bawah potongan adalah terjemahan dari artikel yang mensistematisasikan informasi pada
Vavr Collections API .
Diterjemahkan oleh
@middle_javaArtikel Asli Yang Dimodifikasi Terakhir: 15 Agustus 2019
1. Ikhtisar
Perpustakaan Vavr, sebelumnya dikenal sebagai Javaslang, adalah perpustakaan fungsional untuk Jawa. Pada artikel ini, kami mengeksplorasi API koleksi yang kuat.
Lihat
artikel ini untuk informasi lebih lanjut tentang perpustakaan ini.
2. Koleksi Persisten
Koleksi persisten, saat dimodifikasi, membuat versi baru koleksi tanpa mengubah versi saat ini.
Dukungan untuk beberapa versi dari koleksi yang sama dapat menyebabkan penggunaan CPU dan memori yang tidak efisien. Namun, perpustakaan koleksi Vavr mengatasi ini dengan berbagi struktur data antara versi koleksi yang berbeda.
Ini pada dasarnya berbeda dari
unmodifiableCollection() dari
Collections kelas utilitas Java, yang hanya menyediakan pembungkus untuk koleksi basis.
Mencoba mengubah koleksi seperti itu
UnsupportedOperationException alih-alih membuat versi baru. Selain itu, koleksi basis masih bisa berubah melalui tautan langsung ke sana.
3. Dapat dilewati
Traversable adalah tipe dasar dari semua koleksi VAVR. Antarmuka ini mendefinisikan metode umum untuk semua struktur data.
Ini memberikan beberapa metode default yang berguna, seperti
size() ,
get() ,
filter() ,
isEmpty() dan lainnya yang diwarisi oleh sub-interface.
Kami lebih jauh menjelajahi perpustakaan koleksi.
4. Seq
Mari kita mulai dengan urutannya.
Antarmuka
Seq adalah struktur data berurutan. Ini adalah antarmuka induk untuk
List ,
Stream ,
Queue ,
Array ,
Vector dan
CharSeq . Semua struktur data ini memiliki sifat uniknya sendiri, yang akan kita bahas di bawah ini.
4.1. Daftar
List adalah operasi yang dihitung dengan penuh semangat (dievaluasi dengan penuh semangat, dilakukan segera setelah nilai
LinearSeq diketahui) urutan elemen yang memperluas antarmuka
LinearSeq .
List Persistent dibangun secara rekursif menggunakan
kepala dan
ekor :
- Kepala adalah elemen pertama
- Ekor - daftar yang mengandung elemen yang tersisa (daftar ini juga dibentuk dari kepala dan ekor)
List API berisi metode pabrik statis yang dapat Anda gunakan untuk membuat
List . Anda dapat menggunakan metode statis
of() untuk membuat instance
List dari satu atau lebih objek.
Anda juga dapat menggunakan metode static
empty() untuk membuat
List kosong dan metode
ofAll() untuk membuat
List tipe
Iterable :
List < String > list = List.of( "Java", "PHP", "Jquery", "JavaScript", "JShell", "JAVA");
Mari kita lihat beberapa contoh manipulasi daftar.
Kita dapat menggunakan metode
drop() dan variannya untuk menghapus elemen
N pertama:
List list1 = list.drop(2); assertFalse(list1.contains("Java") && list1.contains("PHP")); List list2 = list.dropRight(2); assertFalse(list2.contains("JAVA") && list2.contains("JShell")); List list3 = list.dropUntil(s - > s.contains("Shell")); assertEquals(list3.size(), 2); List list4 = list.dropWhile(s - > s.length() > 0); assertTrue(list4.isEmpty());
drop(int n) menghapus
n item dari daftar, mulai dari item pertama, sementara
dropRight() melakukan hal yang sama, mulai dari item terakhir dalam daftar.
dropUntil() menghapus item dari daftar sampai predikat
true , sementara
dropWhile() menghapus item sampai predikat
true .
Ada juga
dropRightWhile() dan
dropRightUntil() yang menghapus item mulai dari kanan.
Selanjutnya,
take(int n) digunakan untuk mengambil item dari daftar. Dibutuhkan
n item dari daftar dan kemudian berhenti. Ada juga
takeRight(int n) , yang mengambil elemen dari akhir daftar:
List list5 = list.take(1); assertEquals(list5.single(), "Java"); List list6 = list.takeRight(1); assertEquals(list5.single(), "Java"); List list7 = list.takeUntil(s - > s.length() > 6); assertEquals(list3.size(), 3);
Akhirnya,
takeUntil() mengambil elemen dari daftar sampai predikat menjadi
true . Ada varian
takeWhile() yang juga menggunakan argumen predikat.
Selain itu, API memiliki metode lain yang bermanfaat, misalnya, bahkan
distinct() , yang mengembalikan daftar elemen dengan duplikat yang dihapus, dan
distinctBy() , yang menerima
Comparator untuk menentukan kesetaraan.
Sangat menarik bahwa ada juga
intersperse() , yang menyisipkan elemen di antara setiap elemen daftar. Ini bisa sangat nyaman untuk operasi dengan
String :
List list8 = list .distinctBy((s1, s2) - > s1.startsWith(s2.charAt(0) + "") ? 0 : 1); assertEquals(list3.size(), 2); String words = List.of("Boys", "Girls") .intersperse("and") .reduce((s1, s2) - > s1.concat(" " + s2)) .trim(); assertEquals(words, "Boys and Girls");
Ingin membagi daftar menjadi beberapa kategori? Dan untuk ini ada API:
Iterator < List < String >> iterator = list.grouped(2); assertEquals(iterator.head().size(), 2); Map < Boolean, List < String >> map = list.groupBy(e - > e.startsWith("J")); assertEquals(map.size(), 2); assertEquals(map.get(false).get().size(), 1); assertEquals(map.get(true).get().size(), 5);
Metode
group(int n) membagi
List menjadi kelompok-kelompok elemen
n masing-masing. Metode
groupdBy() mengambil
Function yang berisi logika untuk memisahkan daftar dan mengembalikan
Map dengan dua elemen:
true dan
false .
Kunci sebenarnya dipetakan ke
List elemen yang memenuhi kondisi yang ditentukan dalam
Function . Kunci
false memetakan ke
List elemen yang tidak memenuhi kondisi ini.
Seperti yang diharapkan, ketika mengubah
List ,
List asli tidak benar-benar berubah. Sebaliknya, versi baru
List selalu dikembalikan.
Kita juga dapat berinteraksi dengan
List menggunakan semantik stack - mengekstraksi elemen sesuai dengan prinsip "last in, first out" (LIFO). Dalam pengertian ini, metode API seperti
peek() ,
pop() dan
push() ada untuk memanipulasi tumpukan:
List < Integer > intList = List.empty(); List < Integer > intList1 = intList.pushAll(List.rangeClosed(5, 10)); assertEquals(intList1.peek(), Integer.valueOf(10)); List intList2 = intList1.pop(); assertEquals(intList2.size(), (intList1.size() - 1));
Fungsi
pushAll() digunakan untuk memasukkan berbagai bilangan bulat pada stack, dan fungsi
peek() digunakan untuk mengambil elemen head stack. Ada juga metode
peekOption() yang dapat membungkus hasilnya dalam objek
Option .
Ada metode lain yang menarik dan sangat berguna dalam antarmuka
List yang didokumentasikan secara menyeluruh dalam dokumen
Java .
4.2. Antrian
Queue tidak berubah menyimpan elemen, memungkinkan Anda untuk mengambilnya sesuai dengan prinsip FIFO (masuk pertama, keluar pertama).
Queue dalam
Queue terdiri dari dua daftar tertaut:
List depan dan
List belakang.
List depan berisi item yang dihapus dari antrian, dan
List belakang berisi item yang antri.
Ini memungkinkan Anda untuk menempatkan operasi antrian dan menghapus dari antrian ke kompleksitas
O (1) . Ketika
List berakhir di
List depan ketika dihapus dari antrian,
List belakang terbalik dan menjadi
List depan baru.
Mari kita membuat antrian:
Queue < Integer > queue = Queue.of(1, 2); Queue < Integer > secondQueue = queue.enqueueAll(List.of(4, 5)); assertEquals(3, queue.size()); assertEquals(5, secondQueue.size()); Tuple2 < Integer, Queue < Integer >> result = secondQueue.dequeue(); assertEquals(Integer.valueOf(1), result._1); Queue < Integer > tailQueue = result._2; assertFalse(tailQueue.contains(secondQueue.get(0)));
Fungsi
dequeue() menghilangkan elemen head dari
Queue dan mengembalikan
Tuple2<T, Q> . Elemen pertama dari tuple adalah elemen head yang dihapus dari antrian, elemen kedua dari tuple adalah elemen
Queue tersisa.
Kita bisa menggunakan
combination(n) untuk mendapatkan semua kemungkinan kombinasi
N elemen dalam
Queue :
Queue < Queue < Integer >> queue1 = queue.combinations(2); assertEquals(queue1.get(2).toCharSeq(), CharSeq.of("23"));
Sekali lagi,
Queue asli tidak berubah saat menambah / menghapus item dari antrian.
4.3. Aliran
Stream adalah implementasi dari daftar yang ditautkan secara malas yang sangat berbeda dari
java.util.stream . Tidak seperti
java.util.stream ,
Stream Vavr menyimpan data dan dengan malas menghitung elemen berikutnya.
Katakanlah kita memiliki bilangan bulat
Stream :
Stream < Integer > s = Stream.of(2, 1, 3, 4);
Saat mencetak hasil
s.toString() di konsol, hanya
Stream (2 ,?) yang akan ditampilkan. Ini berarti bahwa hanya elemen Head
Stream yang dihitung, sedangkan elemen ekor tidak.
Memanggil
s.get(3) dan kemudian menampilkan hasil
s.tail() mengembalikan
Stream (1, 3, 4 ,?) . Sebaliknya, jika Anda tidak memanggil
s.get(3) - yang akan membuat
Stream menghitung elemen terakhir - hanya
Stream (1 ,?) Akan menjadi hasil dari
s.tail() ) . Ini berarti bahwa hanya elemen ekor pertama yang dihitung.
Perilaku ini dapat meningkatkan kinerja dan memungkinkan
Stream untuk digunakan untuk mewakili urutan yang (secara teoritis) sangat panjang.
Stream di Vavr tidak dapat diubah dan dapat berupa
Empty atau
Cons .
Cons terdiri dari elemen kepala dan ekor
Stream dihitung malas. Tidak seperti
List ,
Stream menyimpan elemen kepala dalam memori. Elemen ekor dihitung sesuai kebutuhan.
Mari kita buat
Stream 10 bilangan bulat positif dan hitung jumlah bilangan genap:
Stream < Integer > intStream = Stream.iterate(0, i - > i + 1) .take(10); assertEquals(10, intStream.size()); long evenSum = intStream.filter(i - > i % 2 == 0) .sum() .longValue(); assertEquals(20, evenSum);
Berbeda dengan
Stream API dari Java 8,
Stream di Vavr adalah struktur data untuk menyimpan urutan elemen.
Oleh karena itu, ia memiliki metode seperti
get() ,
append() ,
insert() dan lainnya untuk memanipulasi elemen-elemennya.
drop() ,
distinct() dan beberapa metode lain yang dibahas sebelumnya juga tersedia.
Akhirnya, mari kita cepat tunjukkan
tabulate() di
Stream . Metode ini mengembalikan
Stream panjang
n mengandung elemen yang merupakan hasil dari penerapan fungsi:
Stream < Integer > s1 = Stream.tabulate(5, (i) - > i + 1); assertEquals(s1.get(2).intValue(), 3);
Kita juga dapat menggunakan
zip() untuk membuat
Stream dari
Tuple2<Integer, Integer> , yang berisi elemen yang dibentuk dengan menggabungkan dua
Stream :
Stream < Integer > s = Stream.of(2, 1, 3, 4); Stream < Tuple2 < Integer, Integer >> s2 = s.zip(List.of(7, 8, 9)); Tuple2 < Integer, Integer > t1 = s2.get(0); assertEquals(t1._1().intValue(), 2); assertEquals(t1._2().intValue(), 7);
4.4. Array
Array adalah urutan indeks yang tidak berubah yang menyediakan akses acak yang efisien. Ini didasarkan pada
array Java objek. Intinya, ini adalah pembungkus
Traversable untuk berbagai objek bertipe
TAnda dapat membuat turunan
Array menggunakan metode statis
of() . Selain itu, Anda dapat membuat berbagai elemen menggunakan
range() metode statis
range() dan
rangeBy() . Metode
rangeBy() memiliki parameter ketiga, yang memungkinkan Anda menentukan langkah.
Metode
range() dan
rangeBy() akan membuat elemen, mulai dari nilai awal ke nilai akhir dikurangi satu. Jika kita perlu memasukkan nilai akhir, kita dapat menggunakan
rangeClosed() atau
rangeClosedBy() :
Array < Integer > rArray = Array.range(1, 5); assertFalse(rArray.contains(5)); Array < Integer > rArray2 = Array.rangeClosed(1, 5); assertTrue(rArray2.contains(5)); Array < Integer > rArray3 = Array.rangeClosedBy(1, 6, 2); assertEquals(list3.size(), 3);
Mari kita bekerja dengan elemen menggunakan indeks:
Array < Integer > intArray = Array.of(1, 2, 3); Array < Integer > newArray = intArray.removeAt(1); assertEquals(3, intArray.size()); assertEquals(2, newArray.size()); assertEquals(3, newArray.get(1).intValue()); Array < Integer > array2 = intArray.replace(1, 5); assertEquals(s1.get(0).intValue(), 5);
4.5. Vektor
Vector adalah persilangan antara
Array dan
List , menyediakan urutan elemen yang diindeks, memungkinkan akses acak dan modifikasi dalam waktu konstan:
Vector < Integer > intVector = Vector.range(1, 5); Vector < Integer > newVector = intVector.replace(2, 6); assertEquals(4, intVector.size()); assertEquals(4, newVector.size()); assertEquals(2, intVector.get(1).intValue()); assertEquals(6, newVector.get(1).intValue());
4.6. Charseq
CharSeq adalah objek koleksi untuk mewakili urutan karakter primitif. Intinya, ini adalah pembungkus untuk
String dengan penambahan operasi pengumpulan.
Untuk membuat
CharSeq Anda harus melakukan yang berikut ini.
CharSeq chars = CharSeq.of("vavr"); CharSeq newChars = chars.replace('v', 'V'); assertEquals(4, chars.size()); assertEquals(4, newChars.size()); assertEquals('v', chars.charAt(0)); assertEquals('V', newChars.charAt(0)); assertEquals("Vavr", newChars.mkString());
5. Atur
Bagian ini membahas berbagai implementasi
Set di perpustakaan koleksi. Fitur unik dari struktur data
Set adalah tidak mengijinkan nilai duplikat.
Ada berbagai implementasi
Set . Yang utama adalah
HashSet .
TreeSet tidak memungkinkan elemen duplikat dan dapat diurutkan.
LinkedHashSet mempertahankan urutan elemen penyisipan.
Mari kita lihat lebih dekat implementasi ini satu demi satu.
5.1. Hashset
HashSet memiliki metode pabrik statis untuk membuat instance baru. Beberapa di antaranya kami pelajari sebelumnya dalam artikel ini, misalnya
of() ,
ofAll() dan variasi pada
range() metode.
Perbedaan antara dua
set dapat diperoleh dengan menggunakan metode
diff() . Juga, metode
union() dan
intersect() mengembalikan union dan persimpangan dua
set :
HashSet < Integer > set0 = HashSet.rangeClosed(1, 5); HashSet < Integer > set0 = HashSet.rangeClosed(1, 5); assertEquals(set0.union(set1), HashSet.rangeClosed(1, 6)); assertEquals(set0.diff(set1), HashSet.rangeClosed(1, 2)); assertEquals(set0.intersect(set1), HashSet.rangeClosed(3, 5));
Kami juga dapat melakukan operasi dasar, seperti menambah dan menghapus elemen:
HashSet < String > set = HashSet.of("Red", "Green", "Blue"); HashSet < String > newSet = set.add("Yellow"); assertEquals(3, set.size()); assertEquals(4, newSet.size()); assertTrue(newSet.contains("Yellow"));
Implementasi
HashSet didasarkan pada
hash array mapped trie (HAMT) , yang menawarkan kinerja yang unggul dibandingkan dengan
HashTable biasa dan strukturnya membuatnya cocok untuk mendukung koleksi persisten.
5.2. Treeset
Immutable
TreeSet adalah implementasi dari antarmuka
SortedSet . Ini menyimpan satu set elemen yang diurutkan dan diimplementasikan menggunakan pohon pencarian biner. Semua operasinya dilakukan selama waktu
O (log n) .
Secara default, elemen
TreeSet diurutkan dalam urutan alami mereka.
Mari kita membuat
SortedSet menggunakan urutan sortir alami:
SortedSet < String > set = TreeSet.of("Red", "Green", "Blue"); assertEquals("Blue", set.head()); SortedSet < Integer > intSet = TreeSet.of(1, 2, 3); assertEquals(2, intSet.average().get().intValue());
Untuk mengatur item dengan cara kustom, berikan instance
Comparator saat membuat
TreeSet . Anda juga dapat membuat string dari serangkaian elemen:
SortedSet < String > reversedSet = TreeSet.of(Comparator.reverseOrder(), "Green", "Red", "Blue"); assertEquals("Red", reversedSet.head()); String str = reversedSet.mkString(" and "); assertEquals("Red and Green and Blue", str);
5.3. Bitset
Koleksi VAVR juga memiliki implementasi
BitSet tidak berubah. Antarmuka
BitSet memperluas antarmuka
SortedSet .
BitSet dapat dibuat menggunakan metode statis di
BitSet.Builder .
Seperti dengan implementasi lain dari struktur
Set data,
BitSet tidak memungkinkan Anda untuk menambahkan rekaman duplikat ke set.
Ini mewarisi metode untuk manipulasi dari antarmuka
Traversable . Perhatikan bahwa ini berbeda dari
java.util.BitSet dari perpustakaan Java standar. Data
BitSet tidak dapat berisi nilai-nilai
String .
Pertimbangkan untuk membuat instance
BitSet menggunakan metode
of() factory:
BitSet < Integer > bitSet = BitSet.of(1, 2, 3, 4, 5, 6, 7, 8); BitSet < Integer > bitSet1 = bitSet.takeUntil(i - > i > 4); assertEquals(list3.size(), 4);
Untuk memilih empat elemen
BitSet pertama
BitSet kami menggunakan perintah
takeUntil() . Operasi mengembalikan contoh baru. Perhatikan bahwa metode
takeUntil() didefinisikan dalam antarmuka
Traversable , yang merupakan antarmuka induk untuk
BitSet .
Metode dan operasi lain yang dijelaskan di atas didefinisikan dalam antarmuka
Traversable juga berlaku untuk
BitSet .
6. Peta
Map adalah struktur data nilai kunci.
Map di Vavr tidak dapat diubah dan memiliki implementasi untuk
HashMap ,
TreeMap dan
LinkedHashMap .
Biasanya, kontrak
peta tidak memungkinkan kunci duplikat, sementara nilai duplikat dipetakan ke kunci yang berbeda mungkin.
6.1. Hashmap
HashMap adalah implementasi dari antarmuka
Map tidak dapat diubah. Ini menyimpan pasangan nilai kunci menggunakan hash kunci.
Map di Vavr menggunakan
Tuple2 untuk mewakili pasangan nilai kunci dan bukan tipe
Entry tradisional:
Map < Integer, List < Integer >> map = List.rangeClosed(0, 10) .groupBy(i - > i % 2); assertEquals(2, map.size()); assertEquals(6, map.get(0).get().size()); assertEquals(5, map.get(1).get().size());
Seperti
HashSet , implementasi
HashMap didasarkan pada
Hash array mapped trie (HAMT) , yang mengarah ke waktu yang konstan untuk hampir semua operasi.
Elemen
peta dapat disaring dengan kunci menggunakan metode
filterKeys() atau dengan nilai menggunakan metode
filterValues() . Kedua metode menggunakan
Predicate sebagai argumen:
Map < String, String > map1 = HashMap.of("key1", "val1", "key2", "val2", "key3", "val3"); Map < String, String > fMap = map1.filterKeys(k - > k.contains("1") || k.contains("2")); assertFalse(fMap.containsKey("key3")); Map < String, String > map1 = map1.filterValues(v - > v.contains("3")); assertEquals(list3.size(), 1); assertTrue(fMap2.containsValue("val3"));
Anda juga dapat mengubah elemen
peta menggunakan metode
map() . Misalnya, mari kita konversi
map1 ke
Map<String, Integer> :
Map < String, Integer > map2 = map1.map( (k, v) - > Tuple.of(k, Integer.valueOf(v.charAt(v.length() - 1) + ""))); assertEquals(map2.get("key1").get().intValue(), 1);
6.2. Treemap
Immutable
TreeMap adalah implementasi dari antarmuka
SortedMap . Seperti
TreeSet , instance kustom
Comparator digunakan untuk menyesuaikan pengurutan elemen
TreeMap .
SortedMap tunjukkan pembuatan
SortedMap :
SortedMap < Integer, String > map = TreeMap.of(3, "Three", 2, "Two", 4, "Four", 1, "One"); assertEquals(1, map.keySet().toJavaArray()[0]); assertEquals("Four", map.get(4).get());
Secara default, entri
TreeMap diurutkan dalam urutan kunci alami. Namun, Anda dapat menentukan
Comparator akan digunakan untuk menyortir:
TreeMap < Integer, String > treeMap2 = TreeMap.of(Comparator.reverseOrder(), 3, "three", 6, "six", 1, "one"); assertEquals(treeMap2.keySet().mkString(), "631");
Seperti dalam kasus
TreeSet , implementasi
TreeMap juga dibuat menggunakan pohon, oleh karena itu, operasinya punya waktu
O (log n) . Metode
map.get(key) mengembalikan
Option , yang berisi nilai kunci
peta yang ditentukan.
7. Kompatibilitas Java
API Koleksi Vavr sepenuhnya kompatibel dengan Java Collection Framework. Mari kita lihat bagaimana hal ini dilakukan dalam praktek.
7.1. Konversi dari Java ke Vavr
Setiap implementasi pengumpulan di Vavr memiliki pabrik statis metode
ofAll() yang menerima
java.util.Iterable . Ini memungkinkan Anda untuk membuat koleksi
VAVR dari koleksi
Java . Demikian pula, metode factory
ofAll() langsung menerima Java
Stream .
Untuk mengonversi
List Java ke
List yang tidak dapat diubah:
java.util.List < Integer > javaList = java.util.Arrays.asList(1, 2, 3, 4); List < Integer > vavrList = List.ofAll(javaList); java.util.stream.Stream < Integer > javaStream = javaList.stream(); Set < Integer > vavrSet = HashSet.ofAll(javaStream);
Fungsi lain yang berguna adalah
collector() , yang dapat digunakan bersama dengan
Stream.collect() untuk mendapatkan koleksi Vavr:
List < Integer > vavrList = IntStream.range(1, 10) .boxed() .filter(i - > i % 2 == 0) .collect(List.collector()); assertEquals(4, vavrList.size()); assertEquals(2, vavrList.head().intValue());
7.2. Konversi dari Vavr ke Java
Antarmuka
Value memiliki banyak metode untuk mengkonversi dari tipe
Vavr ke tipe
Java . Metode ini memiliki format
toJavaXXX() .
Perhatikan beberapa contoh:
Integer[] array = List.of(1, 2, 3) .toJavaArray(Integer.class); assertEquals(3, array.length); java.util.Map < String, Integer > map = List.of("1", "2", "3") .toJavaMap(i - > Tuple.of(i, Integer.valueOf(i))); assertEquals(2, map.get("2").intValue());
Kami juga dapat menggunakan Java 8
Collectors untuk mengumpulkan item dari koleksi Vavr:
java.util.Set < Integer > javaSet = List.of(1, 2, 3) .collect(Collectors.toSet()); assertEquals(3, javaSet.size()); assertEquals(1, javaSet.toArray()[0]);
7.3. Tampilan Koleksi Java
Selain itu, perpustakaan menyediakan apa yang disebut
tampilan koleksi yang berfungsi paling baik ketika dikonversi ke koleksi Java. Metode transformasi di bagian sebelumnya iterate over (iterate) semua elemen untuk membuat koleksi Java.
Tampilan, di sisi lain, mengimplementasikan antarmuka Java standar dan mendelegasikan panggilan metode ke koleksi basis Vavr.
Pada saat penulisan ini, hanya tampilan
List yang didukung. Setiap kumpulan berurutan memiliki dua metode: satu untuk membuat representasi yang tidak dapat diubah, yang lain untuk bisa berubah.
Metode panggilan untuk mengubah pada tampilan yang tidak berubah
UnsupportedOperationException .
Mari kita lihat sebuah contoh:
@Test(expected = UnsupportedOperationException.class) public void givenVavrList_whenViewConverted_thenException() { java.util.List < Integer > javaList = List.of(1, 2, 3) .asJava(); assertEquals(3, javaList.get(2).intValue()); javaList.add(4); }
Untuk membuat tampilan yang tidak berubah:
java.util.List < Integer > javaList = List.of(1, 2, 3) .asJavaMutable(); javaList.add(4); assertEquals(4, javaList.get(3).intValue());
8. Kesimpulan
Dalam tutorial ini, kami belajar tentang berbagai struktur data fungsional yang disediakan oleh Vavr Collections API. Ada juga metode API yang bermanfaat dan produktif yang dapat ditemukan di
Java doc dan Panduan
Pengguna Koleksi Vavr.
Akhirnya, penting untuk dicatat bahwa pustaka juga mendefinisikan
Try ,
Option ,
Either dan
Future , yang memperluas antarmuka
Value dan, sebagai hasilnya, mengimplementasikan antarmuka Java
Iterable . Ini berarti bahwa dalam beberapa situasi mereka dapat berperilaku seperti koleksi.
Kode sumber lengkap untuk semua contoh dalam artikel ini dapat ditemukan di
Github .
Bahan tambahan:
habr.com/en/post/421839www.baeldung.com/vavrDiterjemahkan oleh
@middle_java