Ответы на вопросы на собеседование Java 8 (часть 1).

  • Какие нововведения, появились в Java 8?

В Java 8 было добавлено много функций, наиболее значимые из них упомянуты ниже:
  • Полноценная поддержка лямбда-выражений, которая добавляет функциональные возможности обработки данных для Java.
  • Ключевое слово default в интерфейсах для поддержки функциональности по умолчанию(интерфейс может иметь реализацию метода по умолчанию).
  • Ссылки на методы.
  • Функциональные интерфейсы (предикаты, поставщики и т. д.)
  • Потоки (stream) для работы с коллекциями
  • Новое API для работы с датами
  • Nashorn движок JavaScript, разрабатываемый полностью на Java компанией Oracle.

  • Как сортировать список строк с помощью лямбда-выражения?

Следующий код сортирует список строк с помощью лямбда-выражения Java 8:

  • Какова структура лямбда-выражения?

Лямбда выражение имеет следующую структуру:
(method params) -> {lambda expression body}
где 
  • method params - список входящих параметров, разделенных запятой(в случаи если параметров больше одного заключаются в скобки). 
  • оператор "->" - служит разделителем между списком параметров нашего метода и телом, в котором происходит его реализация. 
  • lambda expression body - тело метода, состоящее из одного выражения или нескольких, заключенных в фигурные скобки.

  • К каким переменным есть доступ у Лямбда-выражений?

Лямбда-выражения имеют доступ к переменным области видимости, в которой их определили. Но доступ возможен только при условии, что переменные являются effective final, то есть либо явно имеют модификатор final, либо не меняют своего значения после инициализации, если переменной присваивается значение во второй раз, лямбда-выражение вызывает ошибку компиляции.

  • Что такое ссылки на метод?

Ссылки на метод - компактные лямбда-выражения которые позволяют передавать ссылки на методы или конструкторы. Для этого нужно использовать ключевое слово "::".
Ссылочные методы внедряют полезный синтаксис, чтобы ссылаться на существующие методы или конструкторы Java-классов или объектов (экземпляров). Совместно с лямбда-выражениями, ссылочные методы делают языковые конструкции компактными и лаконичными, делая его шаблонным.

  • Какие виды ссылок на методы вы знаете?

Существует четыре вида ссылок на методы:
  • Ссылка на статический метод(ContainingClass::staticMethodName)
  • Ссылка на метод конкретного объекта(ContainingObject::instanceMethodName)
  • Ссылка на метод произвольного объекта конкретного типа(ContainingType::methodName)
  • Ссылка на конструктор(ClassName::new), для дженериков (generics) Class< T >::new.

  • Объясните выражение System.out::println.

Выражение System.out::println является ссылкой на статический метод println об'єкта out класа System, который эквивалентен лямбда-выражению x -> System.out.println(x).

  • Что такое функциональные интерфейсы?

Функциональный интерфейс - это тот интерфейс, который определяет строго один абстрактный метод.
В Java 8 была введена новая аннотация @FunctionalInterface для обозначения интерфейса, функциональным, эта аннотация используется для того, чтобы избежать случайного добавления абстрактных методов в функциональный интерфейс. Она не обязательна, но является хорошей практикой написания кода.
Функциональные интерфейсы позволяют нам использовать лямбда-выражения для создания экземпляра таких интерфейсов.
Лучшим примером функционального интерфейса будет интерфейс java.lang.Runnable с одним абстрактным методом run(). Заметим, интерфейс может включать сколько угодно default методов и при этом оставаться функциональным, потому что default методы - не абстрактные.

  • Для чего нужен функциональный интерфейс BiConsumer<T,U>?

Представляет собой операцию, которая принимает два входных параметра, и не возвращает никакого результата.

  • Для чего нужен функциональный интерфейс BiFunction<T,U,R>?

Представляет собой функцию, которая принимает два аргумента и возвращает результат.

  • Для чего нужен функциональный интерфейс BinaryOperator<T>?

Представляет собой операцию над двумя операндами одного и того же типа, выполняет над ними бинарную операцию и возвращает результат того же типа, что и операнды.

  • Для чего нужен функциональный интерфейс BiPredicate<T,U>?

Представляет собой предикат (булеву функцию) двух аргументов.

  • Для чего нужен функциональный интерфейс BooleanSupplier?

Представляет собой поставщика булевых результатов.

  • Для чего нужен функциональный интерфейс Consumer<T>?

Представляет собой операцию, которая принимает один входной аргумент, выполняет некоторое действие над объектом типа T, при этом ничего не возвращая.

  • Для чего нужен функциональный интерфейс DoubleBinaryOperator?

Представляет собой операцию над двумя операндами типа double, возвращает результат типа double.

  • Для чего нужен функциональный интерфейс DoubleConsumer?

Представляет собой операцию, которая принимает один аргумент типа double, и не возвращает результат.

  • Для чего нужен функциональный интерфейс DoubleFunction<R>?

Представляет собой функцию, которая принимает один аргумент типа double, и возвращает результат.

  • Для чего нужен функциональный интерфейс DoublePredicate?

Представляет собой предикат (булеву функцию) одного аргумента типа double.

  • Для чего нужен функциональный интерфейс DoubleSupplier?

Представляет собой поставщика double результатов.

  • Для чего нужен функциональный интерфейс DoubleToIntFunction?

Представляет собой функцию, которая принимает один аргумент типа double, возвращает результат типу int.

  • Для чего нужен функциональный интерфейс DoubleToLongFunction?

Представляет собой функцию, которая принимает один аргумент типа double, и возвращает результат типу long.

  • Для чего нужен функциональный интерфейс DoubleUnaryOperator?

Представляет собой операцию над одним аргументом типа double, возвращает результат типу double.

  • Для чего нужен функциональный интерфейс Function<T,R>?

Представляет собой функцию перехода от объекта типа T к объекту типа R.

  • Для чего нужен функциональный интерфейс IntBinaryOperator?

Представляет собой операцию над двумя операндами типа int, возвращает результат типа int.

  • Для чего нужен функциональный интерфейс IntConsumer?

Представляет собой операцию, которая принимает один аргумент типа int, и не возвращает результат.

  • Для чего нужен функциональный интерфейс IntFunction<R>?

Представляет собой операцию, которая принимает один аргумент типа int, возвращает результат.

  • Для чего нужен функциональный интерфейс IntPredicate?

Представляет собой предикат (булеву функцию) одного аргумента типа int.

  • Для чего нужен функциональный интерфейс IntSupplier?

Представляет собой поставщика int результатов.

  • Для чего нужен функциональный интерфейс IntToDoubleFunction?

Представляет собой функцию, которая принимает один аргумент типа int, возвращает результат типу double.

  • Для чего нужен функциональный интерфейс IntToLongFunction?

Представляет собой функцию, которая принимает один аргумент типа int, возвращает результат типу long.

  • Для чего нужен функциональный интерфейс IntUnaryOperator?

Представляет собой операцию над одним аргументом типа int, возвращает результат типу int.

  • Для чего нужен функциональный интерфейс LongBinaryOperator?

Представляет собой операцию над двумя операндами типа long, возвращает результат типа long.

  • Для чего нужен функциональный интерфейс LongConsumer?

Представляет собой операцию, которая принимает один аргумент типа long, не возвращает результат.

  • Для чего нужен функциональный интерфейс LongFunction<R>?

Представляет собой функцию, которая принимает один аргумент типа long, и возвращает результат.

  • Для чего нужен функциональный интерфейс LongPredicate?

Представляет собой предикат (булеву функцию) одного аргумента типа long.

  • Для чего нужен функциональный интерфейс LongSupplier?

Представляет собой поставщика long результатов.

  • Для чего нужен функциональный интерфейс LongToDoubleFunction?

Представляет собой функцию, которая принимает один аргумент типа long, и возвращает результат типу double.

  • Для чего нужен функциональный интерфейс LongToIntFunction?

Представляет собой функцию, которая принимает один аргумент типа long, и возвращает результат типу int.

  • Для чего нужен функциональный интерфейс LongUnaryOperator?

Представляет собой операцию над одним аргументом типа long, возвращает результат типу long.

  • Для чего нужен функциональный интерфейс ObjDoubleConsumer<T>?

Представляет собой операцию, которая принимает один аргумент типа object, и второй типа double, и не возвращает результат.

  • Для чего нужен функциональный интерфейс ObjIntConsumer<T>?

Представляет собой операцию, которая принимает один аргумент типа object, и второй типа int, и не возвращает результат.

  • Для чего нужен функциональный интерфейс ObjLongConsumer<T>?

Представляет собой операцию, которая принимает один аргумент типа object, и второй типа long, и не возвращает результат.

  • Для чего нужен функциональный интерфейс Predicate<T>?

Представляет собой предикат (булеву функцию) одного аргумента.

  • Для чего нужен функциональный интерфейс Supplier<T>?

Представляет собой поставщика результатов.

  • Для чего нужен функциональный интерфейс ToDoubleBiFunction<T,U>?

Представляет собой функцию, которая принимает два аргумента, возвращает результат типу double.

  • Для чего нужен функциональный интерфейс ToDoubleFunction<T>?

Представляет собой функцию, которая принимает один аргумент, возвращает результат типа double.

  • Для чего нужен функциональный интерфейс ToIntBiFunction<T,U>?

Представляет собой функцию, которая принимает два аргумента, возвращает результат типу int.

  • Для чего нужен функциональный интерфейс ToIntFunction<T>?

Представляет собой функцию, которая принимает один аргумент, возвращает результат типа int.

  • Для чего нужен функциональный интерфейс ToLongBiFunction<T,U>?

Представляет собой функцию, которая принимает два аргумента, возвращает результат типу long.

  • Для чего нужен функциональный интерфейс ToLongFunction<T>?

Представляет собой функцию, которая принимает один аргумент, возвращает результат типа long.

  • Для чего нужен функциональный интерфейс UnaryOperator<T>?

Представляет собой операцию над одним операндом, возвращает результат того же типа, что и операнд.

Java 8 (часть 2).

Рассказать друзьям:

1 коментарі :

  1. А разве println() статический? Статический там только объект out.

    ОтветитьУдалить