Perpustakaan Guava: Apa saja fitur yang paling berguna dan / atau tersembunyi? [Tutup]

131

Saya telah melakukan pemindaian cepat terhadap Guava API dan jenis koleksi baru yang disediakannya ( Multimapdan BiMapmisalnya tampak bermanfaat) dan saya berpikir untuk menyertakan perpustakaan dalam proyek yang sedang saya kerjakan.

Namun, saya juga ragu-ragu untuk memasukkan perpustakaan mau tak mau jika tidak ada manfaatnya dan mempelajari fitur-fitur itu menghabiskan waktu yang berharga.

Sudahkah Anda memasukkan perpustakaan Guava dalam proyek Anda dan telah terbukti bermanfaat dengan cara yang tidak terduga? Apakah Anda akan selalu menggunakannya di masa depan? Apa manfaat / penghematan waktu utamanya? Apa saja fitur tersembunyinya?

NimChimpsky
sumber
4
Judul dan pertanyaan Anda tidak benar-benar cocok.
aioobe
4
"jenis koleksi baru ... nampak bermanfaat" dan "Saya memiliki sikap diam untuk memasukkan perpustakaan ... jika tidak ada manfaatnya" - yah, siapakah itu? Anda juga berpikir perpustakaan itu bermanfaat dan bermanfaat atau tidak
matt b
Pada 2017 (pertanyaan sekarang ditutup), jika Anda menggunakan Gradle terbaru (4.4.1) jambu 21.0 ditambahkan ke build.gradle secara default sebagai ketergantungan, dengan kata-kata "Ketergantungan ini digunakan secara internal, dan tidak terpapar kepada konsumen. pada kompilasi classpath mereka sendiri ", menunjukkan bahwa tim Gradle telah memutuskan ada beberapa hal yang sangat berharga di sana.
mike rodent

Jawaban:

158

Serius, semua yang ada di Jambu berguna. Saya sudah menggunakannya cukup lama, dan saya masih selalu menemukan sesuatu yang baru yang bisa saya lakukan dengannya yang membutuhkan lebih sedikit kode daripada melakukannya dengan tangan.

Beberapa hal yang orang lain belum sebutkan yang saya sukai:

  • MultimapHanya hebat. Kapan pun Anda akan menggunakan sesuatu seperti Map<Foo, Collection<Bar>>, gunakan multimap sebagai gantinya dan simpan sendiri satu ton pemeriksaan yang membosankan untuk koleksi yang ada yang dipetakan ke sebuah kunci dan buat serta tambahkan jika itu tidak ada.
  • Orderingsangat bagus untuk membangun Comparatoryang berperilaku seperti yang Anda inginkan.
  • Maps.uniqueIndexdan Multimaps.index: metode-metode ini mengambil a Iterabledan a Functiondan membangun ImmutableMapatau ImmutableListMultimapyang mengindeks nilai-nilai pada Iterablehasil penerapan fungsi masing-masing. Jadi dengan fungsi yang mengambil ID suatu item, Anda dapat mengindeks daftar item dengan ID mereka dalam satu baris.
  • Hal-hal fungsional yang disediakannya ... filter,, transformdll. Terlepas dari kejelasan penggunaan kelas untuk Functions dan Predicates, saya merasa ini berguna. Saya memberikan contoh satu cara untuk membuat ini dibaca dengan baik di sini .
  • ComparisonChainadalah kelas kecil, mudah diabaikan yang berguna ketika Anda ingin menulis metode perbandingan yang membandingkan beberapa nilai berturut-turut dan harus kembali ketika perbedaan pertama ditemukan. Ini menghilangkan semua kebosanan itu, membuatnya hanya beberapa baris panggilan metode dirantai.
  • Objects.equal(Object,Object) - null sama dengan safe.
  • Objects.hashCode(Object...) - cara mudah untuk mendapatkan kode hash berdasarkan beberapa bidang kelas Anda.
  • Objects.firstNonNull(Object,Object) - mengurangi kode untuk mendapatkan nilai default jika nilai pertama adalah null, terutama jika nilai pertama adalah hasil dari pemanggilan metode (Anda harus menetapkannya ke variabel sebelum melakukan ini dengan cara normal).
  • CharMatcherSudah disebutkan, tapi mereka sangat kuat.
  • Throwablesmemungkinkan Anda melakukan beberapa hal yang menyenangkan dengan throwable, seperti Throwables.propagateyang memikirkan kembali throwable jika itu adalah RuntimeExceptionatau atau Errormembungkusnya dengan RuntimeExceptiondan melemparkannya sebaliknya.

Saya pasti bisa melanjutkan, tetapi saya harus mulai bekerja. =) Ngomong-ngomong, meskipun saya telah mendaftarkan beberapa hal yang saya suka di sini, kenyataannya adalah bahwa segala sesuatu di Jambu berguna dalam beberapa situasi atau lainnya. Sebagian besar berguna sangat sering. Saat Anda menggunakannya, Anda akan menemukan lebih banyak kegunaan. Tidak menggunakannya akan terasa seperti memiliki satu tangan diikat di belakang Anda.

ColinD
sumber
2
Sepenuhnya setuju ComparisionChain.
whiskeysierra
44

Saya telah menggunakan Guava secara efektif selama beberapa tahun, di dalam Google - dan ini luar biasa.

Bagian yang sangat saya sukai adalah:

  • Charsets.* - sangat sederhana, sangat berguna
  • Koleksi
  • Penanganan IO (membaca sumber daya sepenuhnya dalam satu baris, dll)
  • Splitter/Joiner
  • Preconditions
Jon Skeet
sumber
6
Perhatikan bahwa kita sekarang memiliki StandardCharsets di Java 7+. Saya bertanya-tanya berapa banyak fitur Guava lainnya telah menemukan jalan mereka ke Jawa.
DavidS
1
Saya menemukan Plugin Modernizer Maven ini yang mendeteksi penggunaan API lawas, termasuk perpustakaan pihak ketiga seperti Guava. File konfigurasi tampaknya berisi 67 penghentian Guava, termasuk StandardCharsets.
DavidS
28

Saya awalnya menggunakannya untuk koleksi steno. Misalnya, alih-alih:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

kamu bisa melakukan ini:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

Juga mudah mengisi peta:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

Sekarang, saya telah menemukan beberapa utilitas bermanfaat lainnya yang ada di Jambu. Misalnya, kelas CharMatcher memungkinkan Anda untuk mencocokkan urutan karakter. Anda dapat melakukan:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

atau

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");
dogbane
sumber
21

Metode precomputed () ( sumber ) CharMatcher adalah "fitur tersembunyi" yang bagus yang saya temukan pada suatu hari.

Ini benar-benar hanya optimasi, yang membuat tabel pencarian (menggunakan bit array), dan kemudian hanya mencari karakter untuk melihat apakah mereka "cocok".

Ini adalah jenis optimasi tersembunyi yang dapat Anda manfaatkan saat menggunakan perpustakaan, yang mungkin tidak Anda pikirkan sendiri dalam kode Anda sendiri.

Tentu saja, jika Anda membuat CharMatcher kompleks, yang Anda rencanakan akan digunakan berkali-kali, Anda harus ingat untuk memanggil metode precomputed (), seperti:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
Etienne Neveu
sumber
Saya juga memiliki pertanyaan tentang jambu biji ListenableFuture . Jika memungkinkan, bisakah Anda meninjau desain saya dan membantu saya menjelaskan beberapa keraguan saya dan bagaimana saya harus menghadapinya? Saya baru-baru ini mulai bekerja dengan Guava ListenableFuture dan saya sangat suka tetapi memiliki beberapa kebingungan mengenai cara menggunakannya secara efisien.
john
16

Berikut adalah video YouTube dari Google (pembicara: Kevin Bourrillion, insinyur utama untuk perpustakaan Java inti Google) yang menunjukkan keindahan Google Collections. Satu hal yang dilakukan Google, yang saya yakini brilian, adalah jaminan Immutability dalam koleksi.

Buhake Sindi
sumber
12

Google Guava adalah perpustakaan utilitas, jadi saya ragu ada kelas pembunuh di dalamnya. Seluruh hal tentang utilitas adalah Anda hampir menggunakannya dalam setiap proyek yang Anda miliki. Saya tidak ingat proyek apa pun yang saya lakukan yang tidak menggunakan koleksi Java. Dan kebenarannya adalah, koleksi utilitas Google Guava luar biasa dan harus berada di Java SDK itu sendiri.

Saya telah menulis tiga artikel tentang kelas di Google Guava:

Dan ini belum semuanya, ada banyak hal lain yang bisa Anda lakukan dengan Jambu Biji.

nanda
sumber
8

Benar-benar sangat bermanfaat. Hampir selalu perpustakaan pertama ditambahkan ke proyek baru.

  1. Kami sangat menyukai Iterators / Iterables dan antarmuka Fungsi.
  2. Kelompok layanan antarmuka adalah abstraksi yang bagus
  3. Kami sangat berkomitmen sehingga kami mulai menggunakan kelas ImmutableXXX jenis API kami untuk berkomunikasi sehingga tidak dapat diubah.
  4. Peta komputasi (dari MapMaker) luar biasa dalam situasi tertentu.

Secara keseluruhan, kualitas perpustakaan sangat tinggi. API dipikirkan dengan baik, implementasi yang solid. Sangat dianjurkan.

Darren Gilroy
sumber
7

MapMaker sekarang menawarkan cache LRU terbatas - itu adalah beberapa mesin substansial yang tersembunyi di balik API kecil. Ini memiliki potensi utilitas yang sangat besar, dan saya masih menggunakan kode.

Dimitris Andreou
sumber