Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Интерфейс java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.

Операции над стримами бывают или промежуточными (intermediate) или конечными (terminal). Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же стрим. Таким образом вы можете строить цепочки из несколько операций над одним и тем же стримом.

У стрима может быть сколько угодно вызовов промежуточных операций и последним вызов конечной операции. При этом все промежуточные операции выполняются лениво и пока не будет вызвана конечная операция никаких действий на самом деле не происходит (похоже на создание объекта Thread или Runnable, без вызова start()).

Стримы создаются на основе источников каких-либо, например классов из java.util.Collection.

Ассоциативные массивы (maps), например, HashMap, не поддерживаются.

Операции над стримами могут выполняться как последовательно, так и параллельно.

Потоки не могут быть использованы повторно. Как только была вызвана какая-нибудь конечная операция, поток закрывается.

Кроме универсальных объектных существуют особые виды стримов для работы с примитивными типами данных int, long и double: IntStream, LongStream и DoubleStream. Эти примитивные стримы работают так же, как и обычные объектные, но со следующими отличиями:

☕️ используют специализированные лямбда-выражения, например, IntFunction или IntPredicate вместо Function и Predicate;
☕️ поддерживают дополнительные конечные операции sum(), average(), mapToObj().
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом method reference (ссылка на метод) для непосредственной передачи этого метода. Такая ссылка передается в виде:

☕️ имя_класса::имя_статического_метода для статического метода;
☕️ объект_класса::имя_метода для метода экземпляра;
☕️ название_класса::new для конструктора.

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

Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более качественную информацию о типе и при возможности выбора между использованием ссылки на существующий метод и использованием лямбда-выражения, следует всегда предпочитать использование ссылки на метод.
#вопросы_с_собеседований
Что такое default методы интерфейса?
☕️ Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию.
☕️ Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
☕️ Метод по умолчанию не может переопределить метод класса java.lang.Object.
☕️ Помогают реализовывать интерфейсы без страха нарушить работу других классов.
☕️ Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
☕️ Дают свободу классам выбрать метод, который нужно переопределить.
☕️ Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
Класс StringJoiner используется, чтобы создать последовательность строк, разделенных разделителем с возможностью присоединить к полученной строке префикс и суффикс:

StringJoiner joiner = new StringJoiner(".", "prefix-", "-suffix");
for (String s : "Hello the brave world".split(" ")) {
joiner.add(s);
}
System.out.println(joiner); //prefix-Hello.the.brave.world-suffix
#вопросы_с_собеседований
Для чего нужны функциональные интерфейсы Predicate<T>, DoublePredicate, IntPredicate и LongPredicate?
Predicate<T> (предикат) - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса T и возвращающая на выходе значение типа boolean.

Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).

Predicate<String> predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false

☕️ DoublePredicate
- предикат, получающий на вход Double;
☕️ IntPredicate - предикат, получающий на вход Integer;
☕️ LongPredicate - предикат, получающий на вход Long.
#вопросы_с_собеседований
Как получить вторую субботу текущего месяца используя Date Time API?
LocalDate
.of(
LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(
TemporalAdjusters.next(DayOfWeek.SATURDAY));
Интенсив по Docker для разработчиков без «капитанской теории». Отправляемся 25 февраля.

На 2 дня оставим за бортом всё то, о чём и так все знают и погрузимся в глубины крутейшей практики. Вы запустите сайт в контейнере, соберёте несколько контейнеров в рабочую систему, запустите готовый pipeline в Gitlab, рассмотрите подводные камни использования stateful и Docker и научитесь обходить ограничения DockerHub. Помимо этого расскажем об особенностях использования контейнеров с ruby, php, python, go, java, c#, c++ и работе Docker в облаках.

Интересно? А ведь это ещё не всё! Почитать всю программу (там много вкусного) и посмотреть реальные примеры практических заданий можно на сайте.

Йо-хо-хо, морские волки! На абордаж!
Инкапсуляция — в информатике размещение в одном компоненте данных и методов, которые с ними работают. Также может означать скрытие внутренней реализации от других компонентов.
Наследование — создание новой сущности на базе уже существующей.
Полиморфизм — возможность иметь разные формы для одной и той же сущности.
Абстракция — набор общих характеристик.
Посылка сообщений — форма связи, взаимодействия между сущностями.
Переиспользование — все что перечислено выше работает на повторное использование кода.
Это единственно верный порядок парадигм ООП, так как каждая последующая использует предыдущие.
Java Software Solutions (2017)
Авторы: John Lewis, William Loftus
Количество страниц: 800

Java Software Solutions создает прочную основу методов программирования для создания хорошо разработанного объектно-ориентированного программного обеспечения. Книга помогает получить навыки решения задач и знакомит студентов с процессом создания высококачественных программных систем. Новый подход к обучению обеспечивает понимание программистами основных объектно-ориентированных принципов. В тексте используется естественная последовательность повествования с упором на использование объектов перед обучением их написанию, что дает учащимся знания и навыки, необходимые для разработки.

Скачать книгу
#вопросы_с_собеседований
1. Для чего в JUnit используется аннотация @Ignore?
2. Чем stub отличается от mock (в тестовых объектах)?
Начал самостоятельно изучать Python? Хотел бы получить советы от практикующих специалистов?

С 1 по 3 февраля будет проходить бесплатный онлайн-интенсив Skillbox по программированию, где ты получишь полезные знания и советы практикующего специалиста, сооснователя и технического директора Lia с семилетним опытом в разработке на Python Никиты Левашова.

Подробности по ссылке: 👉 https://clc.am/va7GEw

На занятиях мы расскажем:

как написать скрипт на Python по подбору паролей;
как работать с файлами и запросами;
как реализовать brute-force attack;
как защититься от такой атаки;
как написать консольный интерфейс.

🎁 Всех, кто дойдёт до конца, ждёт подарок — электронная книга Кей Петерсон и Дэвида Колба «Век живи — век учись» издательства МИФ!
1. @Ignore указывает JUnit на необходимость пропустить данный тестовый метод.

2. stub используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.

mock использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.
#вопросы_с_собеседований
В чём различия между volatile и Atomic переменными?
volatile принуждает использовать единственный экземпляр переменной, но не гарантирует атомарность. Например, операция count++ не станет атомарной просто потому что count объявлена volatile. C другой стороны class AtomicInteger предоставляет атомарный метод для выполнения таких комплексных операций атомарно, например getAndIncrement() – атомарная замена оператора инкремента, его можно использовать, чтобы атомарно увеличить текущее значение на один. Похожим образом сконструированы атомарные версии и для других типов данных.