microJUG – Telegram
microJUG
981 subscribers
155 photos
1 video
2 files
237 links
Мысли о Java.
Основной канал: @miniJUG
Буст: https://news.1rj.ru/str/microJUG?boost
Чат: https://news.1rj.ru/str/micro_JUG
Таблица JEP'ов: https://minijug.org/jeps.html
Download Telegram
У вас есть в проекте какие-нибудь утилитные методы, которых вам не хватает в стандартной библиотеке? Меня вот задалбливает каждый раз писать:

for (int i = 0; i < list.size(); i++) {
// action using i and list
}

Поэтому я завёл себе метод:

public static <A> void forEachWithIndex(Iterable<A> iterable, ObjIntConsumer<A> consumer) {
int i = 0;
for (A value : iterable) {
consumer.accept(value, i++);
}
}

Теперь можно писать так:

forEachWithIndex(list, <action>);

К тому же работает не только со списками, а с любым Iterable.

Ещё несколько методов:

public static <A, B> List<B> mapList(List<A> list, Function<A, B> f);

public static <A, B> List<B> mapListWithIndex(List<A> list, ObjIntBiFunction<A, B> f); // Пришлось завести ObjIntBiFunction

public static <T> List<T> flattenList(List<? extends List<T>> list);

А у вас есть что-то подобное? Пишите примеры в комментариях.
А javac это дебаггер и jar это статический анализатор
Сегодня узнал забавный факт, что Comparator.comparing(String::toLowerCase) не компилируется, в то время как Comparator.comparing((String s) -> s.toLowerCase()) прекрасно работает. Проблема в том, что у String.toLowerCase() есть две перегрузки: одна без аргументов, а другая - с Locale. При чём здесь вторая перегрузка, которая вообще не приминима здесь по сигнатуре Function? А пёс его знает. Вот так работает компилятор.
Чуть больше про это можно прочитать здесь.
Копец. В книги Кея Хорстманна написано, что hashCode образуется из адреса памяти 🤦‍♂️
И это последнее, 11-е издание книги.
Тестовое задание от кандидата
А вот это прикольно. Оказывается, почти все классы в java.util.concurrent являются общественным достоянием. Например, AtomicReference, ConcurrentHashMap, Semaphore, CountDownLatch, ReentrantLock, ForkJoinPool и т.д. Единственное исключение – CopyOnWriteArrayList 😀 (Наверное потому, что когда писался, многие куски были скопированы из ArrayList, а тот не является public domain).
Что значит общественное достояние? Значит, что Sun отказался от авторских прав на эти классы, это собственность всего общества. То есть исходный код классов можно копировать, изменять, распространять, продавать без разрешения.
#concurrency
Попросили порекламировать бесплатный Java-митап. Вроде норм ребята. Записываемся 👇

17 июня (то есть сегодня) пройдет бесплатный онлайн Java Meetup со спикерами из Red Hat и Levi9.

В программе:
— "По дороге c облаками, Quarkus, Java и Graal’ем", Алексей Лубянский, Principal Software Engineer в Red Hat
— "Производительность: нюансы против очевидностей", Сергей Цыпанов, Senior Java Developer в Levi9.

Модератор мероприятия: Дмитрий Панин, Levi9 Delivery Director.

Когда? 17 июня, 19:00 по Москве (GMT+3)
Где? Онлайн, бесплатно
Язык докладов: русский

👉 Регистрация
Вы уже перешли на Java 11+?
Final Results
59%
Уже да 😊
32%
Ещё нет 😔
9%
Посмотреть ответы
Вам надо отсортировать список List<Date> по возрастанию. Какой вариант вы выберете?
Final Results
4%
list.sort(null)
27%
list.sort(Comparator.naturalOrder())
31%
Collections.sort(list)
15%
Collections.sort(list, Comparator.naturalOrder())
23%
Затрудняюсь с ответом
Туплы или рекорды? Нахер всё, когда есть Map!
У шарпистов бомбит, что в Java паттерн-матчинг сделали лучше и гибче, чем в C#.
Например, возможность писать case String s && s.isBlank() — по-моему, это очень круто. Такой и должен быть паттерн-матчинг.
💉 Вы привились от COVID-19?
Final Results
34%
Да, обе дозы
13%
Первую дозу только
53%
Нет
Скомпилируется код или нет?
Final Results
72%
Скомпилируется
28%
Не скомпилируется
Какой способ предпочитаете?
#юмор
Мой топ фишек, ради которых хочется перейти на Java 16 (не язык, только JVM и API). То есть то, что появилось в Java 12-16:

Stream.toList()
Collectors.teeing()
String.formatted()
Аннотация java.io.Serial
Lookup.defineHiddenClass() (но не уверен, что смогу найти реальное применение)
JEP 341: Default CDS Archives (ну типа, всё быстрее будет стартовать)
JEP 346: Promptly Return Unused Committed Memory from G1 (приложение будет кушать меньше памяти)
JEP 358: Helpful NullPointerExceptions
Field layout computation overhaul (более компактные объекты). Ну и вообще подобного рода мелкие оптимизации, которые в целом делают JVM чуть-чуть быстрее.

А ради чего вы хотите перейти с Java 11 на более новую версию?
Тут в соседнем треде бурление по поводу логирования в Java. А какие библиотеки используются у вас для логирования?
Final Results
3%
java.util.logging
5%
Log4J (первая, древняя версия)
27%
Log4J 2
75%
SLF4J / Logback
1%
Apache Commons Logging
0%
tinylog
0%
System.Logger (JEP 264, Java 9+)
7%
Простой println
3%
Другое (напишу в комментариях)
В общем, что и требовалось доказать. Никита наехал на джавистов, что у нас чуть ли не каждый день создаётся по новой библиотеке логирования. А в реальности у нас по факту всего лишь две библиотеки, которыми пользуется подавляющее большинство: SLF4J и Log4J 2. Остальные библиотеки либо уже ископаемые и давно мертвы и забыты (Commons Logging, Log4J 1, JUL), либо слишком маргинальные (tinylog). Так что картина во все не настолько плохая, как это может показаться по началу.

Кстати, я уже далеко не первый раз слышу набросы по поводу логирования Java со стороны всяких людей. "Да зачем у вас так всё сложно", "Зачем вы переизобретаете каждый раз то же самое" — постоянно я вижу то в Твиттере, то где-то ещё. А ответ заключается в том, что у нас: а) несложно и б) немного. Библиотеки просто отделяют интерфейс от реализации. В чём здесь сложность? И никакой горы библиотек нет. В опросе я вспомнил лишь 6 библиотек. Это за всё время существования Джавы (26 лет!).
Всё-таки обратная совместимость в Java это сила! Вот так работаешь с проектом, а там зависимость, скомпилированная под Java 1.2. Джава Один Два, 1998 год! И ничего, всё работает, как часы.