TGViewer
Channel Public Channel
Java Learning

Java Learning

@java_per_month

№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.me/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Subscribers
16.5K
Photos
1.6K
Videos
1
Links
1K

Showing posts older than #2718 · Back to latest

Older Posts 20 shown
Post #2716 2.41K
⚙️ LongAccumulator/LongAdder

Два класса, которые представляют собой более производительные замены для AtomicLong. Класс LongAdder позволяет выполнять атомарные арифметические операции над типом long. LongAccumulator принимает произвольную функцию аккумуляции результатов.

🗣️ Эта функция принимает текущее значение, аргумент переданный в метод accumulate() и возвращает результат логического объединения (accumulate) двух значений.

При получении результата все элементы редуцируются в один общий результат. Вся эта кухня намекает нам, что функция аккумуляции должна быть коммутативна и ассоциативна. В противном случае результат будет зависеть от физического порядка выполнения операций, который данный класс не гарантирует.


Java Learning 👩‍💻
  • 👍 7
Post #2715 2.59K
  • 👍 11
  • ❤ 1
Post #2714 2.68K
⌛ Что будет выведено при выполнении кода?

Java Learning 👩‍💻
Post #2713 2.81K
👀 Datafaker

Datafaker создает фиктивные данные для ваших программ JVM за считанные минуты, используя широкий спектр из более чем 100 поставщиков данных.

🗣️ Это может быть очень полезно при генерации тестовых данных для заполнения базы данных, генерации данных для стресс‑теста или анонимизации данных из производственных сервисов. Давайте включим его в наши зависимости.

🔗 Ссылочка на доку

Java Learning 👩‍💻
  • 👍 10
Post #2712 2.96K
⚙️ Instancio

Как вы генерируете тестовые данные в ваших модульных тестах? Instancio поможет нам в этом.

Ее цель — сократить время и количество строк кода, затрачиваемых на ручную настройку данных в модульных тестах. Она создает объекты и заполняет их случайными данными, делая наши тесты более динамичными.

✔️ С помощью Instancio мы можем генерировать случайные данные, но в то же время мы можем установить пользовательские данные в определенном поле.

🔗 Ссылочка на доку

Java Learning 👩‍💻
  • 👍 7
  • 😢 1
Post #2711 2.7K
❓ Парадокс Comparator’а

Если вам нужно написать 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 👩‍💻
  • 👍 22
Post #2707 2.38K
⚙️ Files.lines()/readAllLines()/BufferedReader.lines()

В Java 8 стало возможным гораздо проще выполнить такую простую задачу как прочитать построчно файл. Это ещё одна задача, которая раньше требовала довольно много кода.

🗣️ Аналогичный метод был добавлен в класс BufferedReader, поэтому теперь Stream’ы доступны поверх любого InputStream‘а.

Java Learning 👩‍💻
  • 👍 7
Post #2706 2.27K
➡️ ThreadLocal.withInitial()

Тех, кто плотно работает с многопоточностью, ничем не пронять. Они как ветераны Вьетнама, и даже флешбеки по ночам так же мучают. И этой конструкцией их не напугаешь:

// Java 7 и ранее
ThreadLocal<ObjectMapper> mapper = new ThreadLocal<>() {
@Override
protected ObjectMapper initialValue() {
return new ObjectMapper();
}
};


✔️ Но теперь, за счёт замыканий, стало проще:

// Java 8
ThreadLocal<ObjectMapper> mapper = withInitial(() -> new ObjectMapper());


Java Learning 👩‍💻
  • 👍 5
Post #2704 2.29K
👀 Map.computeIfAbsent()/getOrDefault()/merge()/putIfAbsent()

Возможно, если вы пишете на 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 кинет.

➡️ В Java 8 эта же задача решается проще:

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 👩‍💻
  • 👍 9
  • ❤ 1
Post #2702 2.35K
  • 👍 10
  • ❤ 1
Post #2701 2.56K
⌛ Что будет выведено при выполнении кода?

Java Learning 👩‍💻
Post #2699 2.43K
⚠️ Избегайте конкатенации строк в больших циклах

При добавлении двух строк в цикле (for, while, do-while), использование оператора + приводит к растрате памяти и увеличению времени выполнения.

🗣️ Это происходит из-за создания нового объекта String каждый раз при добавлении новой строки. Лучшей практикой является использование класса StringBuilder.

Java Learning 👩‍💻
  • 👍 16
Post #2698 2.4K
⚙️ Stamped Lock

Reflection позволяет динамически выполнять код, что может быть полезно, но злоупотребление ею снижает поддерживаемость кода.

Например, копирование полей объектов через рефлексию может выглядеть удобным, но добавляет сложности и потенциальные ошибки. Лучше явно копировать свойства, что делает код проще и более читаемым.

🗣️ Новые инструменты для инъекций зависимостей переходят от использования Reflection к генерации кода для улучшения проверки на этапе компиляции.

Java Learning 👩‍💻
  • 👍 5
  • 🤔 4
Post #2697 2.43K
❓ Как правильно использовать утилитарные классы

Утилитарные классы предназначены не для создания объектов, а для предоставления статических методов для выполнения общих функций. Если вы пишете слишком много таких классов, пересмотрите свой подход к проектированию кода.

Однако иногда они необходимы, например, для реализации внутренних предметно-ориентированных языков (DSL) в Java. В таких случаях часто отступают от принципов ООП, чтобы сделать синтаксис короче.

➡️ Если вам все-таки нужно создать утилитарный класс, придерживайтесь следующих рекомендаций:

• Сделайте конструктор приватным, чтобы класс нельзя было создать.
• Сделайте класс final, чтобы его нельзя было наследовать.
• Объединяйте методы в утилитарные классы по функциональности. Избегайте общих названий, таких как MvcUtils или CommonUtils.

Java Learning 👩‍💻
  • 👍 12
Post #2696 2.75K
⚙️ Stamped Lock

Java Concurrent - один из самых интересных и в то же время малоизвестных пакетов Java, особенно среди разработчиков, работающих с веб-фреймворками.

🗣️ Lock - более гибкий механизм синхронизации потоков, чем synchronized. Начиная с Java 8, можно использовать StampedLock вместо ReadWriteLock, что обеспечивает лучшую производительность и оптимистичную блокировку операций чтения.

Java Learning 👩‍💻
  • 👍 10
Post #2694 2.43K
⚙️ Время суток в Time Format

Java 8 значительно улучшила API обработки времени, и дополнительная библиотека, такая как Joda Time, стала часто не нужна.

✔️ С Java 16 можно даже выражать время суток, например, «утром» или «днем», используя стандартный форматер с новым шаблоном формата B.

Только не спрашивайте, почему он называется B. Кстати, вот фрагмент шаблонных букв и символов, обрабатываемых DateTimeFormatter.


Java Learning 👩‍💻
  • 👍 9
Post #2692 2.54K
  • 👍 14
  • ❤ 1
Post #2691 2.61K
⌛ Что будет выведено при выполнении кода?

Java Learning 👩‍💻
Post #2690 2.75K
✉️ Улучшение логирования с использованием Java Logging API

Java предоставляет мощные инструменты для логирования, позволяя разработчикам легко отслеживать и управлять выводом логов.

✔️ Использование Java Logging API (java.util.logging) позволяет гибко настраивать и контролировать логирование в ваших приложениях.

Java Learning 👩‍💻
  • 👍 8
  • ❤ 2
Post #2687 2.21K
➡️ Delay Queue

DelayQueue - особый тип коллекции Java для сортировки элементов по времени задержки.

🗣️ Принадлежит пакету java.util.concurrent, реализует интерфейс BlockingQueue. Элементы извлекаются только при истечении задержки. Для использования необходимо реализовать метод getDelay из интерфейса Delayed.

✔️ Допустим, мы хотим задержать элемент на 10 секунд. Нам просто нужно установить текущее время, увеличенное на 10 секунд для нашего класса DelayedEvent.

Java Learning 👩‍💻
  • 👍 8
  • ❤ 1
  • 😢 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →