ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.12.2023

Просмотров: 485

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Какие конечные методы работы со стримами вы знаете?

findFirst() возвращает первый элемент;

findAny() возвращает любой подходящий элемент;

collect() представляет результат в виде коллекций и других структур данных;

count() возвращает количество элементов;

anyMatch() возвращает true, если условие выполняется хотя бы для одного элемента;


noneMatch() возвращает true, если условие не выполняется ни для одного элемента;

allMatch() возвращает true, если условие выполняется для всех элементов;

min() возвращает минимальный элемент, используя в качестве условия Comparator;

max() возвращает максимальный элемент, используя в качестве условия Comparator;

forEach() применяет функцию к каждому объекту (порядок при параллельном выполнении не гарантируется);

forEachOrdered() применяет функцию к каждому объекту с сохранением порядка элементов;

toArray() возвращает массив значений;

reduce() позволяет выполнять агрегатные функции и возвращать один результат;
Для числовых стримов дополнительно доступны:

sum() возвращает сумму всех чисел;

average() возвращает среднее арифметическое всех чисел.
Какие промежуточные методы работы со стримами вы знаете?

filter() отфильтровывает записи, возвращая только записи, соответствующие условию;

skip() позволяет пропустить определенное количество элементов в начале;

distinct() возвращает стрим без дубликатов (для метода equals());

map() преобразует каждый элемент;

peek() возвращает тот же стрим, применяя к каждому элементу функцию;

limit() позволяет ограничить выборку определенным количеством первых элементов;

sorted() позволяет сортировать значения либо в натуральном порядке, либо задавая
Comparator;

mapToInt(), mapToDouble(), mapToLong() – аналоги map(), возвращающие стрим числовых примитивов;

flatMap(), flatMapToInt(), flatMapToDouble(), flatMapToLong() похожи на map(), но могут создавать из одного элемента несколько.
Для числовых стримов дополнительно доступен метод mapToObj(), который преобразует числовой стрим обратно в объектный.
Как вывести на экран 10 случайных чисел, используя forEach()?
(new Random())
.ints()
.limit(10)
.forEach(System.out::println);


Как можно вывести на экран уникальные квадраты чисел используя метод
map()?
Stream
.of(1, 2, 3, 2, 1)
.map(s -> s * s)
.distinct()
.forEach(System.out::println);
Как вывести на экран количество пустых строк с помощью метода filter()?
System.out.println(
Stream
.of("Hello", "", ", ", "world", "!")
.filter(String::isEmpty)
.count());
Как вывести на экран 10 случайных чисел в порядке возрастания?
(new Random())
.ints()
.limit(10)
.sorted()
.forEach(System.out::println);
Как найти максимальное число в наборе?
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.max()
.getAsInt(); //55
Как найти минимальное число в наборе?
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.min()
.getAsInt(); //2
Как получить сумму всех чисел в наборе?
Stream

.of(5, 3, 4, 55, 2)
.mapToInt()
.sum(); //69
Как получить среднее значение всех чисел?
Stream
.of(5, 3, 4, 55, 2)
.mapToInt(a -> a)
.average()
.getAsDouble(); //13.8
Какие дополнительные методы для работы с ассоциативными массивами
(maps) появились в Java 8?

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. Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с ее учетом.
Как получить текущую дату с использованием Date Time API из Java 8?
LocalDate.now();
Как добавить 1 неделю, 1 месяц, 1 год, 10 лет к текущей дате с
использованием Date Time API?
LocalDate.now().plusWeeks(1);
LocalDate.now().plusMonths(1);
LocalDate.now().plusYears(1);
LocalDate.now().plus(1, ChronoUnit.DECADES);
Как получить следующий вторник, используя Date Time API?
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
Как получить вторую субботу текущего месяца, используя Date Time API?
LocalDate
.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY))
.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
Как получить текущее время с точностью до миллисекунд, используя Date
Time API?
new Date().toInstant();
Как получить текущее время по местному времени с точностью до
миллисекунд, используя Date Time API?
LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
Что такое «функциональные интерфейсы»?
Функциональный интерфейс – это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация
@FunctionalInterface, работающая по принципу @Override. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default-методов и при этом оставаться функциональным, потому что default-методы не абстрактные.

Для чего нужны функциональные интерфейсы Function,
DoubleFunction, IntFunction и LongFunction?
Function – интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса T и возвращающая на выходе экземпляр класса R.
Методы по умолчанию могут использоваться для построения цепочек вызовов (compose,
andThen).
Function toInteger = Integer::valueOf;
Function backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
DoubleFunction – функция, получающая на вход Double и возвращающая на выходе экземпляр класса R.
IntFunction – функция, получающая на вход Integer и возвращающая на выходе экземпляр класса R.
LongFunction – функция, получающая на вход Long и возвращающая на выходе экземпляр класса R.
Для чего нужны функциональные интерфейсы UnaryOperator,
DoubleUnaryOperator, IntUnaryOperator и LongUnaryOperator?
UnaryOperator (унарный оператор) принимает в качестве параметра объект типа T,
выполняет над ними операции и возвращает результат операций в виде объекта типа T:
UnaryOperator operator = x -> x * x;
System.out.println(operator.apply(5)); // 25
DoubleUnaryOperator – унарный оператор, получающий на вход Double.
IntUnaryOperator – унарный оператор, получающий на вход Integer.
LongUnaryOperator – унарный оператор, получающий на вход Long.
Для чего нужны функциональные интерфейсы BinaryOperator,
DoubleBinaryOperator, IntBinaryOperator и LongBinaryOperator?
BinaryOperator (бинарный оператор) – интерфейс, с помощью которого реализуется функция, получающая на вход два экземпляра класса T и возвращающая на выходе экземпляр класса T.
BinaryOperator operator = (a, b) -> a + b;
System.out.println(operator.apply(1, 2)); // 3
DoubleBinaryOperator – бинарный оператор получающий на вход Double.
IntBinaryOperator – бинарный оператор получающий на вход Integer.
LongBinaryOperator – бинарный оператор получающий на вход Long.


Для чего нужны функциональные интерфейсы Predicate, DoublePredicate,
IntPredicate и LongPredicate?
Predicate (предикат) – интерфейс, с помощью которого реализуется функция,
получающая на вход экземпляр класса T и возвращающая на выходе значение типа boolean.
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).
Predicate predicate = (s) -> s.length() > 0;
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
DoublePredicate – предикат, получающий на вход Double.
IntPredicate – предикат, получающий на вход Integer.
LongPredicate – предикат, получающий на вход Long.
Для чего нужны функциональные интерфейсы Consumer,
DoubleConsumer, IntConsumer и LongConsumer?
Consumer (потребитель) – интерфейс, с помощью которого реализуется функция,
которая получает на вход экземпляр класса T, производит с ним некоторое действие и ничего не возвращает.
Consumer hello = (name) -> System.out.println("Hello, " + name);
hello.accept("world");
DoubleConsumer – потребитель, получающий на вход Double.
IntConsumer – потребитель, получающий на вход Integer.
LongConsumer – потребитель, получающий на вход Long.
Для чего нужны функциональные интерфейсы Supplier, BooleanSupplier,
DoubleSupplier, IntSupplier и LongSupplier?
Supplier (поставщик) – интерфейс, с помощью которого реализуется функция, ничего не принимающая на вход, но возвращающая на выход результат класса T;
Supplier now = LocalDateTime::now;
now.get();
DoubleSupplier – поставщик, возвращающий Double.
IntSupplier – поставщик, возвращающий Integer.
LongSupplier – поставщик, возвращающий Long.
Для чего нужен функциональный интерфейс BiConsumer?
BiConsumer представляет собой операцию, которая принимает два аргумента классов
T и U производит с ними некоторое действие и ничего не возвращает.

Для чего нужен функциональный интерфейс BiFunction?
BiFunction представляет собой операцию, которая принимает два аргумента классов T и U и возвращающая результат класса R.
Для чего нужен функциональный интерфейс BiPredicate?
BiPredicate представляет собой операцию, которая принимает два аргумента классов
T и U и возвращающая результат типа boolean.
Для чего нужны функциональные интерфейсы вида _To_Function?
DoubleToIntFunction – операция, принимающая аргумент класса Double и возвращающая результат типа Integer.
DoubleToLongFunction – операция, принимающая аргумент класса Double и возвращающая результат типа Long.
IntToDoubleFunction – операция, принимающая аргумент класса Integer и возвращающая результат типа Double;
IntToLongFunction – операция, принимающая аргумент класса Integer и возвращающая результат типа Long.
LongToDoubleFunction – операция, принимающая аргумент класса Long и возвращающая результат типа Double.
LongToIntFunction – операция, принимающая аргумент класса Long и возвращающая результат типа Integer.
Для чего нужны функциональные интерфейсы ToDoubleBiFunction,
ToIntBiFunction и ToLongBiFunction?
ToDoubleBiFunction – операция, принимающая два аргумента классов T и U и возвращающая результат типа Double.
ToLongBiFunction – операция, принимающая два аргумента классов T и U и возвращающая результат типа Long.
ToIntBiFunction – операция, принимающая два аргумента классов T и U и возвращающая результат типа Integer.
Для чего нужны функциональные интерфейсы ToDoubleFunction,
ToIntFunction и ToLongFunction?
ToDoubleFunction – операция, принимающая аргумент класса T и возвращающая результат типа Double.
ToLongFunction – операция, принимающая аргумент класса T и возвращающая результат типа Long.
ToIntFunction – операция, принимающая аргумент класса T и возвращающая результат типа Integer.
Для чего нужны функциональные интерфейсы ObjDoubleConsumer,
ObjIntConsumer и ObjLongConsumer?
ObjDoubleConsumer – операция, которая принимает два аргумента классов T и Double,
производит с ними некоторое действие и ничего не возвращает.


ObjLongConsumer – операция, которая принимает два аргумента классов T и Long,
производит с ними некоторое действие и ничего не возвращает.
ObjIntConsumer – операция, которая принимает два аргумента классов T и Integer,
производит с ними некоторое действие и ничего не возвращает.
Как определить повторяемую аннотацию?
Чтобы определить повторяемую аннотацию, необходимо создать аннотацию-контейнер для списка повторяемых аннотаций и обозначить повторяемую мета-аннотацией @Repeatable:
@interface Schedulers
{
Scheduler[] value();
}
@Repeatable(Schedulers.class)
@interface Scheduler
{
String birthday() default "Jan 8 1935";
}
Что такое коллекция?
Коллекция – это структура данных, набор каких-либо объектов. Данными (объектами в наборе) могут быть числа, строки, объекты пользовательских классов и т. п.
Назовите основные интерфейсы JCF и их реализации
На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и
Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ –
значение» соответственно.
Интерфейс Collection расширяют интерфейсы:

List (список) представляет собой коллекцию, в которой допустимы дублирующие значения. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу. Реализации:
◦ ArrayList – инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов.
◦ LinkedList (двунаправленный связный список) – состоит из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел.
◦ Vector – реализация динамического массива объектов, методы которой синхронизированы.
◦ Stack – реализация стека LIFO (last-in-first-out).


Set (сет) описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Реализации:
◦ HashSet – использует HashMap для хранения данных. В качестве ключа и значения используется добавляемый элемент. Из-за особенностей реализации порядок элементов не гарантируется при добавлении.
◦ LinkedHashSet – гарантирует, что порядок элементов при обходе коллекции будет идентичен порядку добавления элементов.
◦ TreeSet – предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator либо сохраняет элементы с использованием
«natural ordering».

Queue (очередь) предназначена для хранения элементов с предопределенным способом вставки и извлечения FIFO (first-in-first-out):
◦ PriorityQueue – предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator либо сохраняет элементы с использованием «natural ordering».
◦ ArrayDeque – реализация интерфейса Deque, который расширяет интерфейс
Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first- out).
Расположите в виде иерархии следующие интерфейсы: List, Set, Map,
SortedSet, SortedMap, Collection, Iterable, Iterator, NavigableSet, NavigableMap

Iterable

Collection

List

Set

SortedSet

NavigableSet

Map

SortedMap

NavigableMap

Iterator
Почему Map – это не Collection, в то время как List и Set являются Collection?
Collection представляет собой совокупность некоторых элементов. Map – это совокупность пар «ключ-значение».
Stack считается «устаревшим». Чем его рекомендуют заменять? Почему?
Stack был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции Vector, хотя это несколько нарушает понятие стека (например,
класс Vector предоставляет возможность обращаться к любому элементу по индексу).
Является частично синхронизированной коллекцией (кроме метода добавления push()) с вытекающими отсюда последствиями в виде негативного воздействия на