Java 8 значительно улучшила API обработки времени, и дополнительная библиотека, такая как Joda Time, стала часто не нужна.
B.Только не спрашивайте, почему он называется B. Кстати, вот фрагмент шаблонных букв и символов, обрабатываемых DateTimeFormatter.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Java Concurrent - один из самых интересных и в то же время малоизвестных пакетов Java, особенно среди разработчиков, работающих с веб-фреймворками.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Утилитарные классы предназначены не для создания объектов, а для предоставления статических методов для выполнения общих функций. Если вы пишете слишком много таких классов, пересмотрите свой подход к проектированию кода.
Однако иногда они необходимы, например, для реализации внутренних предметно-ориентированных языков (DSL) в Java. В таких случаях часто отступают от принципов ООП, чтобы сделать синтаксис короче.
• Сделайте конструктор приватным, чтобы класс нельзя было создать.
• Сделайте класс final, чтобы его нельзя было наследовать.
• Объединяйте методы в утилитарные классы по функциональности. Избегайте общих названий, таких как MvcUtils или CommonUtils.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Reflection позволяет динамически выполнять код, что может быть полезно, но злоупотребление ею снижает поддерживаемость кода.
Например, копирование полей объектов через рефлексию может выглядеть удобным, но добавляет сложности и потенциальные ошибки. Лучше явно копировать свойства, что делает код проще и более читаемым.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔4
При добавлении двух строк в цикле (
for, while, do-while), использование оператора + приводит к растрате памяти и увеличению времени выполнения.Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Please open Telegram to view this post
VIEW IN TELEGRAM
Возможно, если вы пишете на Java, то у вас в проекте есть код похожий на этот:
Map<String, Integer> data = ...;
for (String s : strings) {
if (!data.containsKey(key))
data.put(key, 0);
data.put(key, data.get(key) + 1);
}
Суть проста. Есть отображение из строки в счетчик, сколько раз мы встретили эту строку. Надо только не забывать инициализировать позиции Map‘а нулем, а то виртуальная машина в вас NullPointerException кинет.
for (String s : strings)
data.merge(s, 1, (a, b) -> a + b);
Meтод merge принимает ключ, значение и функцию которая объединяет заданное значение и уже существующее в отображении, если таковое имеется. Если в отображении под заданным ключем значения нет, то кладет туда указанное значение.
•
computeIfAbsent() – возвращает или значение из отображения по ключу, или создает его, если его не было;•
cputIfAbsent() – добавляет значение в отображение, только если его там не было. Этот метод ранее имелся только у ConcurrentMap, теперь появился и у Map‘а;•
cgetOrDefault() – название довольно красноречиво. Возвращает значение из отображения или переданное значение по-умолчанию. На мой взгляд, метод довольно не идиоматичен. Для работы с отсутствующими значениями был добавлен тип Optional, его и следовало использовать. Поэтому, я бы добавил метод: Optional<V> getOptional(K key).Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Тех, кто плотно работает с многопоточностью, ничем не пронять. Они как ветераны Вьетнама, и даже флешбеки по ночам так же мучают. И этой конструкцией их не напугаешь:
// Java 7 и ранее
ThreadLocal<ObjectMapper> mapper = new ThreadLocal<>() {
@Override
protected ObjectMapper initialValue() {
return new ObjectMapper();
}
};
// Java 8
ThreadLocal<ObjectMapper> mapper = withInitial(() -> new ObjectMapper());
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
В Java 8 стало возможным гораздо проще выполнить такую простую задачу как прочитать построчно файл. Это ещё одна задача, которая раньше требовала довольно много кода.
BufferedReader, поэтому теперь Stream’ы доступны поверх любого InputStream‘а.Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Если вам нужно написать Comparator для сортировки объектов по возрастанию, обычно он выглядит так:
public class ByScoreComparator implements Comparator<User> {
@Override
public int compare(User u1, User u2) {
return (int) signum(u2.getAge() - u1.getAge());
}
}Теперь это не нужно. Можно использовать ссылки на методы:
Comparator<User> comparator = Comparator
.comparingDouble(User::getAge)
.thenComparing(User::getName);
List<User> hList = ...;
hList.sort(comparator);
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
Как вы генерируете тестовые данные в ваших модульных тестах? Instancio поможет нам в этом.
Ее цель — сократить время и количество строк кода, затрачиваемых на ручную настройку данных в модульных тестах. Она создает объекты и заполняет их случайными данными, делая наши тесты более динамичными.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😢1
Datafaker создает фиктивные данные для ваших программ JVM за считанные минуты, используя широкий спектр из более чем 100 поставщиков данных.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Два класса, которые представляют собой более производительные замены для
AtomicLong. Класс LongAdder позволяет выполнять атомарные арифметические операции над типом long. LongAccumulator принимает произвольную функцию аккумуляции результатов.accumulate() и возвращает результат логического объединения (accumulate) двух значений.При получении результата все элементы редуцируются в один общий результат. Вся эта кухня намекает нам, что функция аккумуляции должна быть коммутативна и ассоциативна. В противном случае результат будет зависеть от физического порядка выполнения операций, который данный класс не гарантирует.
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Раньше я использовал keySet для итерации по HashMap, как показано ниже:
Set<Key> keySet = map.keySet();
for (Key k : keySet) {
Value v = map.get(k);
print(k, v);
}
Set<Map.Entry<Key, Value>> entrySet = map.entrySet();
for (Map.Entry<Key, Value> e : entrySet) {
Key k = e.getKey();
Value v = e.getValue();
}
Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤1
Жаль, что я не знал раньше, что можно написать Singleton в Java всего одной строкой:
public enum Singleton {
INSTANCE;
}• Потокобезопасность: Перечисления в Java создаются с использованием потокобезопасного механизма. Это означает, что вы не столкнетесь с проблемами, связанными с многопоточностью.• Гарантия единственности экземпляра: Java гарантирует, что в системе будет только один экземпляр перечисления, даже при использовании различных потоков или классов загрузчиков.• Сериализация и десериализация: При использовании enum Java автоматически обрабатывает сериализацию и десериализацию таким образом, чтобы сохранить единственность экземпляра. Это означает, что при десериализации вы не получите новый экземпляр, а вернется тот же самый экземпляр.Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Раньше, даже зная элементы заранее, я инициализировал коллекцию так:
List<String> listOfCurrencies = new ArrayList<>();
listOfCurrencies.add("USD/AUD");
listOfCurrencies.add("USD/JPY");
listOfCurrencies.add("USD/INR");
Arrays.asList() возвращает List, его нужно передать конструктору ArrayList, потому что возвращаемый список имеет фиксированную длину, и вы не можете добавлять или удалять элементы.List.of() и Set.of() для создания списка и множества с элементами. Это предпочтительнее, так как они возвращают неизменяемые списки и множества.Java Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17