01. Прошлая и настоящая жизнь
Здравствуйте, меня зовут Гуава.
В 1995 году родился мой брат по прозвищу Конмин, Ява. После 20 лет разработки он стал самым популярным языком программирования в мире, позвольте мне несправедливо отдать «один».
Хотя он часто страдал от различных жалоб, он никогда не переставал двигаться вперед. В дополнение к его собственной непрерывной эволюции, его братья, большие и малые, постоянно обновляются и совершенствуются. Именно на этом фоне я и появился на свет.Я прост и удобен в использовании,и это очень хорошее дополнение к моему старшему брату.Можно сказать,что пока у вас есть проект,использующий моего брата в качестве разработки язык, вы можете почти увидеть мою фигуру.
Я пользуюсь открытым исходным кодом Google, и в настоящее время у меня 39,9 тыс. подписчиков на GitHub, что является свидетельством моей популярности.
Мое тело в основном содержит эти часто используемые модули: коллекция [коллекции], кеш [кэширование], поддержка собственного типа [поддержка примитивов], библиотеки параллелизма [библиотеки параллелизма], общие аннотации [общие аннотации], обработка строк [обработка строк]], я /О и т.д. Новая версия JDK меня прямо познакомила, представляю, какой я хороший, и не могу не гордиться.
Скажем так, изучение того, как использовать меня, сделает вас более счастливым в программировании и написании более элегантного кода!
02. Представьте гуаву
Если вы хотите использовать меня в проекте Maven, вам нужно сначала импортировать мои зависимости в файл pom.xml.
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
Небольшое требование: версия JDK должна быть выше 8.
03. Основные инструменты
Дуг Леа, автор пакета java.util.concurrent, однажды сказал: «null — отстой». Тони Хоар, лауреат премии Тьюринга, автор алгоритма быстрой сортировки и, конечно же, создатель нуля, сказал что-то похожее: «Я потерял миллиард долларов на использовании нуля». возможно нулевой объект.
Пример кода показан ниже.
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
Мой старший брат добавлен в JDK 8Необязательный класс, явно заимствован из моего, но его и мой немного отличаются.
-
Мой вариант «необязательный» является абстрактным, что означает, что у меня могут быть объекты-подклассы; вариант моего старшего брата является окончательным, что означает отсутствие объектов-подклассов.
-
MyOptional реализует интерфейс Serializable и может быть сериализован, в отличие от моего старшего брата.
-
Некоторые мои методы также отличаются от методов моего старшего брата.
В дополнение к нулевой семантике, использование Optional повышает удобочитаемость, и самым большим преимуществом является то, что это надежная защита. Необязательный заставляет вас положительно относиться к отсутствующим ссылкам, потому что вы должны явно получить ссылки из Необязательного.
В дополнение к необязательным я также предоставляю:
- проверка параметров
- Общие методы Object, такие как Objects.equals, Objects.hashCode и класс Objects, введенный в JDK 7, предоставляют одни и те же методы, которые, конечно же, вдохновлены мной.
- более мощный компаратор
04. Коллекция
Сначала позвольте мне рассказать о том, зачем нужны неизменяемые коллекции.
-
Гарантированная безопасность потока. В параллельных программах использование неизменяемых коллекций не только обеспечивает безопасность потоков, но и значительно повышает эффективность параллелизма (по сравнению с параллельными блокировками).
-
Если объекту не нужно поддерживать операции модификации, неизменяемые коллекции сэкономят место и время.
-
Может рассматриваться как константа, и объекты в коллекции не будут изменяться в будущем.
По сравнению с неизменяемыми коллекциями, представленными в JDK, Immutable, который я предоставляю, действительно неизменяем, почему я так говорю? Взгляните на пример ниже.
Следующий код использует JDKCollections.unmodifiableList(list)
Получите немодифицируемую коллекцию unmodifiedList.
List list = new ArrayList();
list.add("雷军");
list.add("乔布斯");
List unmodifiableList = Collections.unmodifiableList(list);
unmodifiableList.add("马云");
Запуск кода вызовет следующее исключение:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1060)
at com.itwanger.guava.NullTest.main(NullTest.java:29)
хорошо выполнятьunmodifiableList.add()
Исключение UnsupportedOperationException возникает, когдаCollections.unmodifiableList()
Возвращается неизменяемая коллекция. Но так ли это на самом деле?
ты можешь поставитьunmodifiableList.add()
заменитьlist.add()
.
List list = new ArrayList();
list.add("雷军");
list.add("乔布斯");
List unmodifiableList = Collections.unmodifiableList(list);
list.add("马云");
Если вы выполните его снова, программа не сообщит об ошибке, и вы обнаружите, что в немодифицируемом списке действительно есть еще один элемент. Что это означает?
Collections.unmodifiableList(…)
Реализация не является настоящей неизменяемой коллекцией.При изменении исходной коллекции элементы в неизменяемой коллекции также изменяются.
Я не допущу этой ошибки, посмотрите на код ниже.
List<String> stringArrayList = Lists.newArrayList("雷军","乔布斯");
ImmutableList<String> immutableList = ImmutableList.copyOf(stringArrayList);
immutableList.add("马云");
пытатьсяimmutableList.add()
бросит, когдаUnsupportedOperationException
. Я вставил исходный кодadd()
метод устарел.
/**
* Guaranteed to throw an exception and leave the collection unmodified.
*
* @throws UnsupportedOperationException always
* @deprecated Unsupported operation.
*/
@CanIgnoreReturnValue
@Deprecated
@Override
public final boolean add(E e) {
throw new UnsupportedOperationException();
}
пытатьсяstringArrayList.add()
ImmutableList не изменяется при изменении исходной коллекции.
Помимо неизменяемых коллекций, я также предоставляю новые типы коллекций, например:
-
Мультимножество, которое может добавлять одинаковые элементы несколько раз. При просмотре как обычной коллекции Multiset ведет себя как неупорядоченный ArrayList; при просмотре как Multiset
Map<E, Integer>
, он также предоставляет операции запросов, соответствующие ожидаемой производительности. -
Multimap, который может легко сопоставить ключ с несколькими значениями.
-
BiMap, особый вид карты, можно использовать с
inverse()
обеспечить регресс
BiMap<K, V>
карта ключ-значение значений гарантированно уникальна, поэтомуvalues()
Возвращает набор вместо обычной коллекции.
05. Обработка строк
Строки представляют собой неизменяемые последовательности символов, которые нельзя изменить после создания. В нашей повседневной работе струны используются очень часто, и умелое обращение с ними может значительно повысить эффективность нашей работы.
Я предоставляю соединитель, Joiner, который соединяет последовательности строк с разделителями. Код ниже вернет "Lei Jun; Jobs", вы можете использоватьuseForNull(String)
метод замены null на некоторую строку, не похожую наskipNulls()
метод игнорирует null напрямую.
Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("雷军", null, "乔布斯");
Я также предоставляю сплиттер - Splitter, который может разбить последовательность строк в соответствии с указанным разделителем.
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("雷军,乔布斯,, 沉默王二");
06. Кэш
Кэширование весьма полезно во многих сценариях. Вы должны знать, что извлечение значения требует больших затрат, особенно если вам нужно получить значение более одного раза, и вам следует рассмотреть возможность использования кеша.
Cache и ConcurrentMap, которые я предоставил, похожи, но не совсем одинаковы. Основное отличие состоит в том, что ConcurrentMap сохраняет все добавленные элементы до тех пор, пока они не будут удалены явным образом. Напротив, кэш, который я предоставляю, обычно настроен на автоматическое восстановление элементов, чтобы ограничить использование памяти.
Если вы готовы использовать некоторое пространство памяти для скорости, вы можете ожидать, что определенные ключи будут запрашиваться более одного раза, а общий объем данных, хранящихся в кеше, не будет превышать объем памяти, вы можете использовать Кэш.
Возьмем пример и почувствуем.
@Test
public void testCache() throws ExecutionException, InterruptedException {
CacheLoader cacheLoader = new CacheLoader<String, Animal>() {
// 如果找不到元素,会调用这里
@Override
public Animal load(String s) {
return null;
}
};
LoadingCache<String, Animal> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 容量
.expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
.removalListener(new MyRemovalListener()) // 失效监听器
.build(cacheLoader); //
loadingCache.put("狗", new Animal("旺财", 1));
loadingCache.put("猫", new Animal("汤姆", 3));
loadingCache.put("狼", new Animal("灰太狼", 4));
loadingCache.invalidate("猫"); // 手动失效
Animal animal = loadingCache.get("狼");
System.out.println(animal);
Thread.sleep(4 * 1000);
// 狼已经自动过去,获取为 null 值报错
System.out.println(loadingCache.get("狼"));
}
/**
* 缓存移除监听器
*/
class MyRemovalListener implements RemovalListener<String, Animal> {
@Override
public void onRemoval(RemovalNotification<String, Animal> notification) {
String reason = String.format("key=%s,value=%s,reason=%s", notification.getKey(), notification.getValue(), notification.getCause());
System.out.println(reason);
}
}
class Animal {
private String name;
private Integer age;
public Animal(String name, Integer age) {
this.name = name;
this.age = age;
}
}
Метод загрузки переписан в CacheLoader. Этот метод будет вызываться, когда кеш запроса не попадет. Здесь я напрямую возвращаю null. На самом деле, это приведет к тому, что CacheLoader вернет null для ключевой информации об исключении, когда нет попадания.
MyRemovalListener используется в качестве класса слушателя, когда элемент кеша недействителен, и метод onRemoval будет вызываться автоматически, когда элемент кеша недействителен. Здесь следует отметить, что этот метод является синхронным методом. Если это занимает много времени, он будет заблокирован, пока обработка не будет завершена.
LoadingCache — это основной рабочий объект кэша, а наиболее часто используемые — это методы put и get.
07. Эпилог
Функции, которые я считаю наиболее часто используемыми, представлены выше.Как основная библиотека разработки Java с открытым исходным кодом от Google, я лично считаю ее очень практичной (иначе? Эй, эй). После внедрения в ваш проект он сможет не только быстро реализовать некоторые часто используемые в разработке функции, но и сделать код более элегантным и лаконичным.
Я думаю, это применимо к каждому Java-проекту, как и к некоторым другим функциям, таким как хеширование, шина событий, математические операции, отражение, ожидающие вашего изучения.
Кроме того, я подготовил для вас китайскую версию официального документа (часть каталога представлена на картинке выше), всего 190 страниц, написано очень подробно, настоятельно рекомендуется скачать копию и поставить его на рабочий стол следующим образом!
Ссылка на сайт:Disk.Baidu.com/Yes/1HR выпустил arc3…Пароль: 684а
Рекомендуемое чтение:
Сколько времени нужно, чтобы изучить Java самостоятельно, можете ли вы найти работу самостоятельно?
Если контент полезен для вас,Пожалуйста, поставьте мне лайк, Refill~, ты самый красивый, ты самый красивый, и ты разбогатеешь в 2021 году.