Бібліотека Guava: Які її найкорисніші та / або приховані функції? [зачинено]


131

У мене було швидке сканування API Guava та нових типів колекцій, які він надає ( Multimapі, BiMapнаприклад, здаються корисними), і я думаю про включення бібліотеки до проектів, над якими я працюю.

Однак у мене також є занепокоєння включати бібліотеки мимоволі, якщо вони не приносять великої користі, і вивчення особливостей витрачає цінний час.

Ви включили бібліотеку Guava у свій проект і чи виявилася вона корисною у будь-який несподіваний спосіб? Ви завжди використовували б це в майбутньому? Яка головна вигода / економія часу? Які його приховані риси?


4
Заголовок і ваше запитання насправді не відповідають.
aioobe

4
"нові типи колекцій ... здаються корисними" і "я не хочу включати бібліотеки ... якщо вони не принесуть великої користі" - ну що це тоді? ви або вважаєте, що бібліотека корисна і має користь, або ви не знаєте
matt b

Станом на 2017 рік (питання зараз закрито), якщо ви використовуєте останню Gradle (4.4.1), guava 21.0 додано для build.gradle за замовчуванням як залежність, зі словами "Ця залежність використовується внутрішньо, а не піддається впливу споживачів про власний клас компіляції ", що дозволяє припустити, що команда Gradle вирішила, що там є щось дійсно цінне
мійський гризун

Відповіді:


158

Серйозно, все в Гуаві корисно. Я використовую його досить довгий час, і все ще завжди відкриваю щось нове, що можу зробити з ним, який займає менше коду, ніж робити це вручну.

Деякі речі, які насправді не згадували, що я люблю:

  • Multimaps просто чудові. Будь-який час ви використовуєте щось на зразок Map<Foo, Collection<Bar>>, використовуйте натомість мультимап та заощадите собі нудну перевірку наявної колекції, зіставлену на ключ, та створіть та додайте її, якщо її немає.
  • Orderingчудово підходить для будівництва Comparators, які ведуть себе як ви хочете.
  • Maps.uniqueIndexі Multimaps.index: ці методи беруть a Iterableі a Functionі будують ImmutableMapабо ImmutableListMultimapіндексують значення в Iterableрезультаті в результаті застосування функції до кожного. Тож за допомогою функції, яка отримує ідентифікатор елемента, ви можете проіндексувати список елементів за їх ідентифікатором в одному рядку.
  • Функціональний матеріал забезпечує ... filter, transformі так далі Не дивлячись на багатослівність з використанням класів для Functions- і Predicateз, я знайшов , що це корисно. Я наводжу приклад одного із способів зробити це прочитаним тут добре .
  • ComparisonChainце невеликий клас, що легко переглядається, який корисний, коли ви хочете написати метод порівняння, який порівнює декілька значень підряд і повинен повертатися, коли знайдена перша різниця. Це видаляє всі труднощі з цим, роблячи лише кілька рядків ланцюгових викликів методу.
  • Objects.equal(Object,Object) - нульова безпека дорівнює.
  • Objects.hashCode(Object...) - простий спосіб отримати хеш-код на основі декількох полів вашого класу.
  • Objects.firstNonNull(Object,Object) - зменшує код для отримання значення за замовчуванням, якщо перше значення є нульовим, особливо якщо перше значення є результатом виклику методу (вам доведеться призначити його змінної, перш ніж робити це звичайним способом).
  • CharMatcherЗгадали вже, але вони дуже потужні.
  • Throwablesдозволяє робити деякі приємні речі з перекидними кодами, наприклад, Throwables.propagateякі перезаряджають кинуті, якщо вони RuntimeExceptionє, Errorі обертають його в, RuntimeExceptionа кидають інакше.

Я, безумовно, міг би продовжувати, але я повинен приступити до роботи. =) У всякому разі, не дивлячись на те, що я перерахував деякі речі, які мені тут подобаються, факт полягає в тому, що все в Гуаві корисне в тій чи іншій ситуації. Багато чого корисно дуже часто. Використовуючи його, ви відкриєте для себе більше застосувань. Якщо не використовувати його, ви відчуєте трохи схожість мати одну руку за спиною.


2
Повністю згоден ComparisionChain.
віскісієра

44

Я ефективно використовую Guava вже пару років всередині Google - і це чудово.

Частини, які мені особливо подобаються:

  • Charsets.* - так просто, так корисно
  • Колекції
  • Обробка IO (прочитати ресурс повністю в одному рядку тощо)
  • Splitter/Joiner
  • Preconditions

6
Зауважте, що тепер у нас є програми StandardCharsets на Java 7+. Цікаво, скільки інших функцій Гуави знайшли свій шлях у Яві.
DavidS

1
Я знайшов цей модуль Modernizer Maven, який виявляє використання застарілих API, включаючи сторонні бібліотеки на зразок Guava. Конфігураційний файл , як представляється , містить 67 гуави, в тому числі про використання застарілих StandardCharsets.
DavidS

28

Я спочатку використовував його для скорочення колекцій. Наприклад, замість:

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

Ви можете це зробити:

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

Карти також легко заповнити:

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

Тепер я виявив деякі інші корисні утиліти, присутні в Гуаві. Наприклад, клас CharMatcher дозволяє зіставляти послідовності символів. Ви можете зробити:

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

або

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

21

CharMatcher по попередньо обчислені () метод ( джерело ) є хорошим «прихований ознака» я натрапив на інший день.

Це дійсно просто оптимізація, яка створює таблицю пошуку (використовуючи бітовий масив), а потім просто шукає символи, щоб побачити, чи вони "відповідають".

Це та прихована оптимізація, яку ви можете використовувати, використовуючи бібліотеку, що ви, можливо, не думали про себе у власному коді.

Звичайно, якщо ви створюєте складний CharMatcher, який ви плануєте використовувати багато разів, ви повинні пам’ятати про виклик методу precomputed (), наприклад:

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

У мене також є питання щодо гуави ListenableFuture . Якщо можливо, ви можете переглянути мій дизайн та допомогти мені прояснити деякі мої сумніви та як я маю з ними боротися? Нещодавно я почав працювати з Guava ListenableFuture, і мені дуже подобається, але є певна плутанина щодо того, як їх ефективно використовувати.
Джон

16

Ось відео YouTube від Google (доповідач: Кевін Бурліон, провідний інженер для основних бібліотек Java Java), який демонструє красу Google Колекцій. Одне, що зробив Google, і я вважаю геніальним, - це гарантія незмінності у колекціях.


12

Google Guava - це корисна бібліотека, тому я сумніваюся, що всередині неї є клас вбивць. Вся справа в корисності - ви майже використовуєте це у всіх своїх проектах. Я не можу згадати жоден проект, який я не використовував у колекції Java. І правда, утиліта збору Google Guava чудова і повинна бути в самому Java SDK.

Я написав три статті про заняття в Google Guava:

І це ще не все, є багато інших речей, які можна зробити з Гуавою.


8

Абсолютно дуже супер корисно. Це майже незмінно перша бібліотека, додана до нового проекту.

  1. Ми дуже любимо Ітератори / Ітерабелі та інтерфейс Функцій.
  2. Сімейство інтерфейсів Сервісу - це великі абстракції
  3. Ми настільки віддані, що почали використовувати класи ImmutableXXX, які використовуються нашими типами API, для того, щоб повідомити, що це неможливо змінити.
  4. Обчислювальні карти (від MapMaker) чудові в певних ситуаціях.

Загалом бібліотека дуже якісна. API добре продуманий, реалізація солідна. Настійно рекомендується.


7

MapMaker тепер пропонує обмежені кеші LRU - це якась істотна техніка, прихована за крихітним API. Це має потенціал для величезної корисності, і я все ще перебуваю під кодом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.