Guava kütüphanesi: En kullanışlı ve / veya gizli özellikleri nelerdir? [kapalı]


131

Guava API'sini ve sağladığı yeni koleksiyon türlerini hızlı bir şekilde taradım ( Multimapve BiMapörneğin yararlı görünüyor) ve kitaplığı üzerinde çalıştığım projelere / projelere dahil etmeyi düşünüyorum.

Bununla birlikte, eğer büyük bir fayda sağlamazlarsa ve özellikleri öğrenmek değerli zamanımı boşa harcıyorlarsa, kütüphaneleri ister istemez dahil etme konusunda suskunluğum var.

Guava kütüphanesini projenize dahil ettiniz mi ve beklenmedik bir şekilde yararlı olduğunu kanıtladı mı? Gelecekte hep kullanır mısın? Asıl faydası / zaman tasarrufu ne oldu? Gizli özellikleri nelerdir?


4
Başlığınız ve sorunuz pek uyuşmuyor.
aioobe

4
"yeni koleksiyon türleri ... yararlı görünüyor" ve "Kütüphaneleri dahil etme konusunda suskunluğum var ... eğer büyük bir fayda sağlamazlarsa" - peki o zaman bu? ya kütüphanenin yararlı olduğunu ve faydası olduğunu düşünüyorsunuz ya da yapmıyorsunuz
matt b

1
2017 itibarıyla (soru kapalıdır), en son Gradle (4.4.1) kullanıyorsanız guava 21.0, bağımlılık olarak varsayılan olarak build.gradle'a eklenir ve "Bu bağımlılık dahili olarak kullanılır ve tüketicilere sunulmaz kendi sınıf yolunu derleyerek ", Gradle ekibinin orada gerçekten değerli bazı şeyler olduğuna karar verdiğini öne sürüyor.
mike kemirgen

Yanıtlar:


158

Cidden, Guava'daki her şey yararlıdır. Bir süredir kullanıyorum ve her zaman onunla yapabileceğim, elle yapmaktan daha az kod gerektiren yeni bir şey keşfediyorum.

Diğerlerinin gerçekten sevdiğimden bahsetmediği bazı şeyler:

  • Multimaps sadece harika. Ne zaman bir şey Map<Foo, Collection<Bar>>kullanırsanız kullanın, bunun yerine bir çoklu harita kullanın ve bir anahtara eşlenmiş mevcut bir koleksiyon için bir ton sıkıcı kontrol yapın ve yoksa onu oluşturun ve ekleyin.
  • Orderingtam Comparatoristediğiniz gibi davranan e-postalar oluşturmak için harika .
  • Maps.uniqueIndexve Multimaps.index: bu yöntemler, bir Iterableve a alır Functionve bir ImmutableMapveya ImmutableListMultimapbu Iterable, işlevin her birine uygulanması sonucunda içindeki değerleri indeksler . Dolayısıyla, bir öğenin kimliğini alan bir işlevle, bir öğe listesini tek bir satırda kimliklerine göre dizine ekleyebilirsiniz.
  • O ... sağlayan fonksiyonel şeyler filter, transformiçin sınıfları kullanarak ayrıntı rağmen vb Functions ve Predicates, ben bu yararlı buldum. Bunu güzelce okutmanın bir yolunu burada örnek veriyorum .
  • ComparisonChainarka arkaya birden çok değeri karşılaştıran ve ilk fark bulunduğunda geri dönmesi gereken bir karşılaştırma yöntemi yazmak istediğinizde yararlı olan küçük, kolayca gözden kaçan bir sınıftır. Bunun tüm sıkıntısını ortadan kaldırır, onu sadece birkaç satırlık zincirleme yöntem çağrısı yapar.
  • Objects.equal(Object,Object) - null güvenli eşittir.
  • Objects.hashCode(Object...) - sınıfınızın birden çok alanına göre bir karma kod almanın kolay yolu.
  • Objects.firstNonNull(Object,Object) - ilk değer null ise, özellikle de ilk değer bir yöntem çağrısının sonucuysa (bunu normal şekilde yapmadan önce bir değişkene atamanız gerekir), varsayılan bir değer almak için kodu azaltır.
  • CharMatcher'den daha önce bahsedilmişti, ancak çok güçlüler.
  • Throwablesatılabilir öğelerle bazı güzel şeyler yapmanızı sağlar, örneğin Throwables.propagateatılabilir bir nesneyi bir RuntimeExceptionveya bir ise yeniden atar Errorve onu a RuntimeExceptionile sarar ve başka türlü atar.

Kesinlikle devam edebilirim, ama işe gitmem gerekiyor. =) Her neyse, burada sevdiğim bazı şeyleri listelemiş olmama rağmen, gerçek şu ki Guava'daki her şey bir durumda veya başka bir durumda yararlıdır. Çoğu, çoğu zaman faydalıdır. Kullandıkça daha fazla kullanım keşfedeceksiniz. Kullanmamak, bir elinizi arkanıza bağlamış gibi hissettirecektir.


2
Tamamen katılıyorum ComparisionChain.
viskisierra

44

Guava'yı Google'da birkaç yıldır etkin bir şekilde kullanıyorum - ve bu harika.

Özellikle sevdiğim kısımlar :

  • Charsets.* - çok basit, çok kullanışlı
  • Koleksiyonları
  • IO işleme (bir kaynağı tamamen tek bir satırda okuyun, vb.)
  • Splitter/Joiner
  • Preconditions

6
Artık Java 7+ sürümünde StandardCharsets'e sahip olduğumuzu unutmayın . Guava'nın başka kaç özelliklerinin Java'ya girdiğini merak ediyorum.
DavidS

1
Guava gibi üçüncü taraf kitaplıkları da dahil olmak üzere eski API'lerin kullanımlarını algılayan bu Modernizer Maven Eklentisini buldum . Yapılandırma dosyası StandardCharsets dahil 67 Guava deprecations içerir görünmektedir.
DavidS

28

Başlangıçta koleksiyon kısayolları için kullandım. Örneğin, bunun yerine:

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

Bunu yapabilirsiniz:

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

Haritaları doldurmak da kolaydır:

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

Şimdi, Guava'da bulunan başka yararlı yardımcı programları keşfettim. Örneğin, CharMatcher sınıfı, karakter dizilerini eşleştirmenize olanak tanır. Yapabilirsin:

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

veya

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

21

CharMatcher'ın precomputed () yöntemi ( kaynak ) geçen gün rastladığım güzel bir "gizli özellik".

Bu gerçekten sadece bir arama tablosu oluşturan (bir bit dizisi kullanarak) ve ardından "eşleşip eşleşmediklerini" görmek için karakterleri arayan bir optimizasyondur.

Bu, kendi kodunuzda kendinizi düşünmemiş olabileceğiniz, bir kitaplık kullanırken yararlanabileceğiniz türden gizli optimizasyondur.

Elbette, birçok kez kullanmayı planladığınız karmaşık bir CharMatcher oluşturursanız, precomputed () yöntemini şu şekilde çağırmayı unutmamalısınız:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();

Guava ListenableFuture hakkında da sorum var . Mümkünse tasarımımı gözden geçirip bazı şüphelerimi ve bunlarla nasıl başa çıkmam gerektiğini açıklamama yardım edebilir misiniz? Kısa süre önce Guava ListenableFuture ile çalışmaya başladım ve çok hoşuma gidiyor, ancak bunları nasıl verimli kullanacağım konusunda kafa karışıklığı yaşıyorum.
John

16

İşte Google'dan bir YouTube videosu (konuşmacı: Kevin Bourrillion, Google'ın temel Java kitaplıklarının baş mühendisi), Google Koleksiyonları'nın güzelliğini gösteriyor. Harika olduğuna inandığım Google'ın yaptığı bir şey , koleksiyonlarda değişmezliği garantilemek .


12

Google Guava bir yardımcı program kitaplığıdır, bu yüzden içinde bir katil sınıf olduğundan şüpheliyim. Yardımcı programla ilgili her şey, sahip olduğunuz her projede neredeyse bunu kullanmanızdır. Java koleksiyonunu kullanmayan hiçbir projeyi hatırlayamıyorum. Ve gerçek şu ki, Google Guava'nın toplama aracı harika ve Java SDK'nın kendisinde olmalıdır.

Google Guava'daki sınıflar hakkında üç makale yazdım:

Ve hepsi bu kadar değil, Guava ile yapabileceğiniz daha birçok şey var.


8

Kesinlikle çok kullanışlı. Neredeyse her zaman yeni bir projeye eklenen ilk kitaplıktır.

  1. Yineleyicileri / Yinelemeleri ve İşlev arayüzünü çok severiz.
  2. Servis arayüz ailesi harika soyutlamalardır
  3. O kadar kararlıyız ki, değiştirilemeyeceğini bildirmek için ImmutableXXX sınıflarını API türlerimizi kullanmaya başladık.
  4. Bilgisayar haritaları (MapMaker'dan) belirli durumlarda harikadır.

Genel olarak, kütüphane çok yüksek kalitede. API iyi düşünülmüş, uygulama sağlam. Şiddetle tavsiye edilir.


7

MapMaker artık sınırlı LRU önbellekleri sunuyor - bu, küçük bir API'nin arkasına gizlenmiş bazı önemli makineler. Bunun büyük bir fayda potansiyeli var ve ben hala kodun her yerindeyim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.