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