JAVA 8

Вопросы к собеседованию

Вопросы по JAVA 8:

Нововведения в JAVA 8

Новые классы для работы с датами в JAVA 8

Новый же Java 8 Date/Time API содержит неизменные, потокобезопасные классы с продуманным дизайном на любой вкус и цвет.

Содержатся они в пакете java.time

Класс Описание
LocalDate дата без времени и временных зон
LocalTime время без даты и временных зо
LocalDateTime дата и время без временных зон
ZonedDateTime дата и время с временной зоной
DateTimeFormatter форматирует даты в строки и наоборот, только для классов java.time
Instant колличество секунд с Unix epoch time (полночь 1 января 1970 UTC)
Duration продолжительность в секундах и наносекундах
Period период времени в годах, месяцах и днях
TemporalAdjuster

корректировщик дат

к примеру, может получить дату следующего понедельника

Optional

Опциональное значение Optional — это контейнер для объекта, который может содержать или не содержать значение null.

Такая обёртка является удобным средством предотвращения NullPointerException, т.к. имеет некоторые функции высшего порядка, избавляющие от добавления повторяющихся if null/notNull проверок:

Optional <String> optional = Optional.of("hello");

optional.isPresent(); // true

optional.ifPresent(s -> System.out.println(s.length())); // 5

optional.get(); // "hello"

optional.orElse("ops..."); // "hello"

Примеры использования и ошибки

Что такое Nashorn?

Не используется в современных версиях

Nashorn - это движок JavaScript, разрабатываемый на Java компанией Oracle. Призван дать возможность встраивать код JavaScript в приложения Java. В сравнении с Rhino, который поддерживается Mozilla Foundation, Nashorn обеспечивает от 2 до 10 раз более высокую производительность, так как он компилирует код и передает байт-код виртуальной машине Java непосредственно в памяти. Nashorn умеет компилировать код JavaScript и генерировать классы Java, которые загружаются специальным загрузчиком. Так же возможен вызов кода Java прямо из JavaScript.

Что такое jjs?

jjs это утилита командной строки, которая позволяет исполнять программы на языке JavaScript прямо в консоли.

Класс для (де)кодировки

Какой класс появился в Java 8 для кодирования/декодирования данных?

используется в читалках (кодирование / декодирования в формат эл. книг)

Base64 - потокобезопасный класс, который реализует кодировщик и декодировщик данных, используя схему кодирования base64 согласно RFC 4648 и RFC 2045.

Методы класса Base64:
Метод Описание

getEncoder()

getDecoder()

возвращает кодировщик/декодировщик base64, соответствующий стандарту RFC 4648

getUrlEncoder()

getUrlDecoder()

возвращает URL-safe кодировщик/декодировщик base64, соответствующий стандарту RFC 4648

getMimeEncoder()

getMimeDecoder()

возвращает MIME кодировщик/декодировщик, соответствующий стандарту RFC 2045

Как создать Base64 кодировщик и декодировщик?

// Encode

String b64 = Base64.getEncoder().encodeToString("input".getBytes("utf-8")); //aW5wdXQ==

// Decode

new String(Base64.getDecoder().decode("aW5wdXQ=="), "utf-8"); //input

Новые методы для maps

Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8?

Ассоциативный массив — абстрактный тип данных (интерфейс к хранилищу данных), позволяющий хранить пары вида «(ключ, значение)» и поддерживающий операции добавления пары, а также поиска и удаления пары по ключу.

источник (wiki)

Метод Описание
putIfAbsent()

добавляет пару «ключ-значение», только если ключ отсутствовал

map.putIfAbsent("a", "Aa");

forEach()

принимает функцию, которая производит операцию над каждым элементом

map.forEach((k, v) -> System.out.println(v));

compute()

создаёт или обновляет текущее значение на полученное в результате вычисления (возможно использовать ключ и текущее значение)

map.compute("a", (k, v) -> String.valueOf(k).concat(v)); //["a", "aAa"]

computeIfPresent()

если ключ существует, обновляет текущее значение на полученное в результате вычисления (возможно использовать ключ и текущее значение)

map.computeIfPresent("a", (k, v) -> k.concat(v))

computeIfAbsent()

если ключ отсутствует, создаёт его со значением, которое вычисляется (возможно использовать ключ)

map.computeIfAbsent("a", k -> "A".concat(k)); //["a","Aa"]

getOrDefault()

в случае отсутствия ключа, возвращает переданное значение по-умолчанию

map.getOrDefault("a", "not found")

merge()

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

map.merge("a", "z", (value, newValue) -> value.concat(newValue)); //["a","Aaz"]

Что такое LocalDateTime?

LocalDateTime объединяет вместе LocaleDate и LocalTime, содержит дату и время в календарной системе ISO-8601 без привязки к часовому поясу.

Время хранится с точностью до наносекунды.

Содержит множество удобных методов, таких как plusMinutes, plusHours, isAfter, toSecondOfDay и т.д.

Что такое ZonedDateTime?

java.time.ZonedDateTime — аналог java.util.Calendar, класс с самым полным объемом информации о временном контексте в календарной системе ISO-8601.

Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с её учётом.