ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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()) с вытекающими отсюда последствиями в виде негативного воздействия на
•
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
Function
Методы по умолчанию могут использоваться для построения цепочек вызовов (compose,
andThen).
Function
Function
backToString.apply("123"); // "123"
DoubleFunction
IntFunction
LongFunction
Для чего нужны функциональные интерфейсы UnaryOperator
DoubleUnaryOperator, IntUnaryOperator и LongUnaryOperator?
UnaryOperator
выполняет над ними операции и возвращает результат операций в виде объекта типа T:
UnaryOperator
System.out.println(operator.apply(5)); // 25
DoubleUnaryOperator – унарный оператор, получающий на вход Double.
IntUnaryOperator – унарный оператор, получающий на вход Integer.
LongUnaryOperator – унарный оператор, получающий на вход Long.
Для чего нужны функциональные интерфейсы BinaryOperator
DoubleBinaryOperator, IntBinaryOperator и LongBinaryOperator?
BinaryOperator
BinaryOperator
System.out.println(operator.apply(1, 2)); // 3
DoubleBinaryOperator – бинарный оператор получающий на вход Double.
IntBinaryOperator – бинарный оператор получающий на вход Integer.
LongBinaryOperator – бинарный оператор получающий на вход Long.
Для чего нужны функциональные интерфейсы Predicate
IntPredicate и LongPredicate?
Predicate
получающая на вход экземпляр класса T и возвращающая на выходе значение типа boolean.
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).
Predicate
predicate.test("foo"); // true
predicate.negate().test("foo"); // false
DoublePredicate – предикат, получающий на вход Double.
IntPredicate – предикат, получающий на вход Integer.
LongPredicate – предикат, получающий на вход Long.
Для чего нужны функциональные интерфейсы Consumer
DoubleConsumer, IntConsumer и LongConsumer?
Consumer
которая получает на вход экземпляр класса T, производит с ним некоторое действие и ничего не возвращает.
Consumer
hello.accept("world");
DoubleConsumer – потребитель, получающий на вход Double.
IntConsumer – потребитель, получающий на вход Integer.
LongConsumer – потребитель, получающий на вход Long.
Для чего нужны функциональные интерфейсы Supplier
DoubleSupplier, IntSupplier и LongSupplier?
Supplier
Supplier
now.get();
DoubleSupplier – поставщик, возвращающий Double.
IntSupplier – поставщик, возвращающий Integer.
LongSupplier – поставщик, возвращающий Long.
Для чего нужен функциональный интерфейс BiConsumer
BiConsumer
T и U производит с ними некоторое действие и ничего не возвращает.
Для чего нужен функциональный интерфейс BiFunction
BiFunction
Для чего нужен функциональный интерфейс 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
ToDoubleBiFunction
ToLongBiFunction
ToIntBiFunction
Для чего нужны функциональные интерфейсы ToDoubleFunction
ToIntFunction
ToDoubleFunction
ToLongFunction
ToIntFunction
Для чего нужны функциональные интерфейсы ObjDoubleConsumer
ObjIntConsumer
ObjDoubleConsumer
производит с ними некоторое действие и ничего не возвращает.
ObjLongConsumer
производит с ними некоторое действие и ничего не возвращает.
ObjIntConsumer
производит с ними некоторое действие и ничего не возвращает.
Как определить повторяемую аннотацию?
Чтобы определить повторяемую аннотацию, необходимо создать аннотацию-контейнер для списка повторяемых аннотаций и обозначить повторяемую мета-аннотацией @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()) с вытекающими отсюда последствиями в виде негативного воздействия на