Меня зовут Аксёнов Вячеслав и я бэкенд разработчик, пишу на Java/Kotlin, расскажу про то, как я сдавал сертификацию на знания Java SE 11 от Oracle. И какие нюансы я понял в процессе подготовки.
Предыстория. Зачем я решил сдавать?
Начну с того, что идея по сдаче именно этой сертификации сидела у меня в голове очень давно. Перед глазами был пример моей жены, у которой есть крайне солидный опыт ETL разработки и сертификат Oracle по базам данных в придачу. Когда ей надоело заниматься построением сложных запросов, она захотела перейти в разработку и писать на Java.
Процесс собеседования Java разработчика до миддла имеет примерно стандартный вид — секция с алгоритмами, секция с java core и конечно секция с знаниями БД. В ее случае на секции БД собеседующие посмотрели на сертификат, на предыдущий опыт и предложили ей самой их пособеседовать. Это конечно просто курьезный случай и все такое, но передо мной есть пример того, как сертификат отлично сработал и помог срезать углы при найме.
Я включил фантазию и представил как может в моем случае помочь сертификат от того же оракла, но по Java. Погуглил и наткнулся на скидку в 90% в честь юбилея Java на сайте оракл и до конца этого периода оставалось всего 2 недели. Что делать? Конечно надо сдавать! Но надо же готовиться? Да не, еще целых 2 недели, успеешь — сказал мне внутренний голос. Так прошла неделя и я начал что-то подозревать…
Для понимания моего бэкграунда — 6 лет специалитета в МГТУ им Н. Э. Баумана, совмещенных с youtube деятельностью, которая никак не относилась к разработке, но занимала все свободное время. После окончания универа прохождение лютого полугодового экспресс курса по java от сотрудников Сбера, которые искали джунов навырост. И опыт работы в размере 2х лет на Java 7-8-11.
Как изменился процесс сдачи?
Дальше нужно несколько слов рассказать про саму сертификацию — как она проходит в период пандемии, на что делается упор при проверке и какие вопросы сейчас есть.
Я уверен, что процесс получения сертификации оракла сейчас выглядит удобнее и приятнее всего, что было раньше:
-
Во первых — раньше было 2 экзамена по 180 минут — сейчас один на час
-
Во вторых — раньше в каждом экзамене было 90 вопросов (в сумме 180), а сейчас всего 50.
То есть со стороны потраченных умственных усилий на сдачу стало проще.
Но это все не значит, что готовиться не нужно. Потому что вся эпопея с сертификацией следующая — она не проверяет твои знания Java. Она проверяет — знание слабых мест и скользких моментов. По крайней мере таким было мое ощущение.
А также — знания использования последних модных фич из Java старше 8.
Нюансы по поводу сдачи сейчас, в период ковида
Я очень хорошо тащил задачи по работе и считал себя вполне солидным специалистом, которому горы по плечо и море по колено, не то что ваша сертификация. Поэтому готовиться мне было откровенно лень. Но оставалась неделя и надо было начинать хоть что-то делать. Я подумал, что смогу хакнуть систему и воспользоваться ковидными условиями и возможностями сдачи по удаленке и смогу сдавать без подготовки пока не сдам.
Если у кого-то будет такая же идея, то вынужден вас огорчить — после исследования документации выяснилось, что пересдавать можно минимум через месяц и в сумме 2-3 раза в год. Таким образом мой план уверенно отправился на свалку.
Ну что поделать, значит нужно сдавать прямо сейчас и с первого раза. Oracle предоставляет «подробные» и полные курсы подготовки к сертификации и так как был праздник, то в период акции они были бесплатными. Честно говоря, в моем случае эти лекции оказались чуть более бесполезными, чем полностью. Там действительно поверхностно покрываются многие темы и фишки java и фичи последних версий. Но для меня это никак не укладывалось в голове. Потому что я некоторыми вещами совсем не пользовался, а просто зазубривать мне не хотелось.
Вся структура сертификации строится следующим образом — есть 5-10 тем, которые важны. И на каждую из этих тем есть по 2-4 вопроса. И в сумме нужно набрать 68% правильных ответов. Значит, что достаточно 34 правильных ответа.
Дальше включаем математику — как набрать эти правильные ответы и мой путь, который я выбрал — полная фокусировка на тех темах, которые я уже знаю и с которыми в реальной жизни работаю и полный игнор тех тем, которые я в реальной жизни не использовал и не видел.
Таким образом проигнорировав глубокие детали для 2-3 тем, которые мне не понравились я освободил себя от 60% работы, которая меня не устраивала. И начал усиленно учить остальное.
Сам процесс сдачи
Так прошли оставшиеся дни до конца акции. Дальше тянуть было нельзя, нужно было сдавать.
Сайт по моему непрофессиональному мнению сайт оракл имеет довольно сложную логику интерфейса и продраться через него до желаемого оказалось не так то просто. Закладывайте часть своих моральных сил на всю организацию.
В конце концов дошел до страницы с регистрацией непосредственно на экзамен, к моему удивлению запись была очень ограничена — выделяются квоты по часам на каждый день, нельзя просто прийти и в свободном ключе выбрать любое время и сдать как удобно. Насколько я понял, ограничен ресурс проверяющих и поэтому дело выглядит довольно близко к атмосфере настоящего экзамена. Хорошо, что ехать никуда не надо.
Дальше интереснее — будет предложена программа в которой будет выполняться сам экзамен. Программа проверит наличие других запущенных программ, подключенных девайсов и наличие вебкамеры. Вебкамера обязательна!
Сам процесс прохождения теста выглядит следующим образом — вы подключается за 15-30 минут до начала и в приложении встаете в очередь на проверку.
В этот момент человек с другой стороны проверяет ваши документы и ставит вас в очередь, все это время важно не отходить, потому что курирующий ваш экзамен человек может подключиться в любой момент. Напомню, что все это время у вас включена камера.
Дальше подключится куратор, который будет наблюдать за вами на всем протяжении экзамена. Рядом с вами должен находиться только компьютер и ваши документы. Никаких других девайсов, шпаргалок, книг и прочих предметов быть не должно. А в комнату не должен никто заходить и не должно быть слышно подозрительных звуков, которые могут вас скомпрометировать. Если бы я занимался раздачей советов, то посоветовал бы к моменту сдачи рассчитывать только на свои силы и не пытаться обмануть куратора. С одной стороны его не видно и может быть ему без разницы как вы сдаете, но с другой стороны все может быть и наоборот. Аннулировать сдачу ничего не стоит. Так что я бы не провоцировал.
Примеры вопросов
Сам экзамен идет ровно по таким вопросам и темам, которые объявляются в процессе подготовки, а конкретно: https://education.oracle.com/java-se-11-developer/pexam_1Z0-819
Примеры вопросов:
8 public class SuperClass {
9 private final int x = 1;
10 static final int y;
11 public SuperClass() {
12 System.out.println(x);
13 System.out.println(y);
14 }
15 public static void main(String[] args) {
16 new SuperClass();
17 }
18 }
Какой будет результат?
А - компилятор упадет на 13 строке
B - компилятор упадет на 16 строке
C - 1
D - компилятор упадет на 9 строке
E - 10
Правильный ответ: A
Следующий пример:
char[][] arrays = {{'g', 'j'}, {'h', 'k'}, {'i', 'l'}};
for (char[] xx : arrays) {
for (char yy : xx) {
System.out.print(yy);
}
System.out.print(" ");
}
какой результат?
А - gj hk il
B - ghi jkl
C - gh ij kl
D - compilation fails
E - ArrayIndexOfBoundsException in runtime
Правильный ответ - A
И такого рода вопросов с подвохами или на “проверь как умеешь компилировать в уме” их много.
Итоги
Вся подготовка привела к моей сдаче сертификации с первого раза на 87% и добавлением новой плашки в свое резюме.
Если вы имеете какой-никакой опыт коммерческой разработки с Java 8+, то вам достаточно будет выделить 1-2 недели своего времени и получить сертификацию, которая потенциально сильно облегчит ваш процесс найма.
Буду рад вашим историям в комментариях — как наличие сертификации повлияло на вашу профессиональную жизнь
Всем привет! В этом году Oracle зарезилил свои экзамены по Java 8 — для сдачи стали доступны Associate (1Z0-808) и Professional (1Z0-809). В этой статье я хочу поделиться опытом прохождения новых экзаменов и подробнее раскрыть встречающиеся темы из восьмой версии. Большая часть будет посвящена Professional, так как он наиболее интересен. Также я не буду поднимать философские вопросы о том, надо ли это вообще — поговорим о технической стороне и о том, как подготовиться к сертификации.
О процедуре заказа уже написано много статей, подробно останавливаться на этом месте смысла не вижу. Регистрируемся на PearsonVUE и Oracle CertView, связываем аккаунты, заказываем, оплачиваем и идем сдавать. Сертификационных центров в Киеве хватает (около десятка), и расписание очень гибкое.
Есть приятный бонус. В этом году Java празднует свое 20-летие, и поэтому во всем мире до конца 2015 года действует скидка 20% на все Java-экзамены. Просто введите промокод «Java20» при оплате на PearsonVUE. Судя по всему, есть возможность заказывать со скидкой на январь 2016.
Oracle Certified Associate (1Z0-808)
Associate — это начальный уровень. Здесь проверяют базовые знания языка. На странице экзамена доступен список тем.
Также можно ознакомиться со списком отличий 7-й и 8-й версий. Если сказать в целом, экзамен по 8 — это такой экзамен по 7, где вас дополнительно спросят о лямбдах и new Date and Time API.
Что есть для подготовки:
— Первая часть книги OCA/OCP Java SE 7 Programmer I & II Study Guide by Kathy Sierra & Bert Bates;
— OCA: Java SE 8 Programmer I Study Guide by Jeanne Boyarsky & Scott Selikoff;
— Очень полезный материал Maurice Naftalin’s Lambda FAQ;
— Java 8 Date and Time.
В практических тестах можно потренироваться на Quizful или выбрать что-нибудь отсюда.
Date and Time
Oracle обожает новый API. Вас ожидают вопросы по основным сущностям пакета java.time.
По факту нужно помнить, что все основные классы являются immutable, и не попадаться на глупых вопросах:
LocalDate localDate = LocalDate.now();
localDate.plus(1, ChronoUnit.DAYS);
В данном случае c оригинальным объектом ничего не произойдет.
То же самое касается Period, ZonedDateTime и других. Никаких родственных связей у этих классов нет (но методы преобразования присутствуют).
LocalDateTime localDateTime = LocalDate.now(); //ошибка компиляции
Ничего суперсложного не будет, просто хорошо почитайте материал и потренируйтесь в IDE.
Лямбды
Здесь также будут базовые вопросы: что это такое, в чём фишка, замените лямбду анонимным классом, перепишите кусок кода с использованием лямбд и так далее. Стоит иметь представление о базовых интерфейсах пакета java.util.function (Consumer, Supplier, Function, Predicate, UnaryOperator).
Также будут вопросы о видимости переменных — в Java 8 появился термин effectively final variable (local variables referenced from a lambda expression must be final or effectively final). Пример:
List<String> list = new ArrayList<>(); list.add("Hi"); list.add("Toast"); list.add("Beer"); int count = 2; list.removeIf((String s) -> s.length() <= count); //1 list.forEach((s) -> System.out.println(s)); //2 if (list.size() == 2) { count = 5; //3 } else { System.out.println("Hello!"); }
В данном случае мы получаем ошибку компиляции в строке 1, так как переменная count изменяется в блоке if и перестает быть effectively final. Если убрать строку 3, всё будет окей. Обратите внимание, что изменение происходит после обращения, но компилятор отслеживает такие вещи. String s в строке 1 не имеет никакого отношения к s в строке 2 — это локальные имена аргументов и разные способы объявления.
Сам экзамен довольно прост. Просто будьте внимательны.
Oracle Certified Professional (1Z0-809)
Он же бывший SCJP. Список тем лежит на странице экзамена. Есть и список отличий 7-й и 8-й версий.
Экзамен появился лишь в августе. В связи с этим есть нюансы — study guide’ы на момент написания статьи отсутствуют. Ближайший релиз ожидается 21-го декабря: OCP: Java SE 8 Programmer II Study Guide by Jeanne Boyarsky & Scott Selikoff.
Как готовиться:
— Материалы по OCA;
— Вторая часть OCA/OCP Java SE 7 Programmer I & II Study Guide by Kathy Sierra & Bert Bates;
— Java SE 8 for the Really Impatient by Cay Horstmann;
— Летом был замечательный курс Oracle JDK 8 Lambdas and Streams. Материалы доступны на YouTube;
— А если и этого мало — Java 8 Stream tutorial;
— Любые mock-тесты. Например, Enthuware 1Z0-809.
Что будет на экзамене? Для начала все классические темы, вопросы по которым «проапгрейджены» с использованием нового синтаксиса и приёмов. Ну и, конечно же, Java 8 (особенно Stream API). О новых темах, которые мне встретились, я и хочу написать ниже.
Optional
Одно из нововведений. Помимо собственной функциональности, активно используется Stream API (reduce, max, min, findAny, etc.). Где искать подвоха и что важно понимать? Optional призван избавить нас от NullPointerException. Так ли это на самом деле?
Optional<String> opt = Optional.of(null);
System.out.println(opt); //и получаем NPE :)
Для избавления существует метод ofNullable. Но и тут есть свой нюанс:
Optional<String> opt = Optional.ofNullable(null); //вернёт Optional.empty
System.out.println(opt.get()); //NoSuchElementException
Почему так было сделано и почему существует of и ofNullable — я нагуглил здесь.
Нельзя изменить контент Optional после создания. Любые манипуляции возвращают новый объект.
Optional<String> optional = Optional.empty(); if (optional.isPresent()) { System.out.println("Yes"); } else { optional.of("Java"); } System.out.println(optional.orElse("Unknown"));
Здесь будет выведено «Unknown» — optional.of(«Java») вернул новый объект, но никуда не присвоил.
Interfaces / Functional Interfaces
Начнем с default/static методов. Есть хороший раздел из Maurice Naftalin’s Lambda FAQ. Со static следует помнить, что в отличии от статических методов класса, статические методы интерфейса не могут быть вызваны через ссылку на объект:
interface One { static void foo() {} } class Alpha implements One { } public static void main(String[] args) { One.foo(); //ок One obj = new Alpha(); obj.foo(); //ошибка компиляции }
Дефолтные методы можно переопределять, но нельзя переопределять статические методы дефолтными и обратно:
interface One { default void foo() { System.out.println("One"); } } interface Two extends One { default void foo() { System.out.println("Two"); } static void foo() { //ошибка компиляции System.out.println("Static Two"); } }
Не стоит пугаться количества функциональных интерфейсов в java.util.function. Основных там не много, и они достаточно хорошо описаны в литературе или документации. Все остальные — это специализации (Bi, Int, Double, Long, etc.). Если почитаете и потренируетесь в IDE, проблем возникнуть не должно.
Если быть невнимательным, можно попасться на чем-то таком:
Function<String> f = name::toUpperCase;
Данный код не скомпилируется, потому что Function<T, R> принимает аргумент и возвращаемый тип. Один аргумент может принимать специализация, например, IntFunction<R> (принимает int, возвращает R).
Еще один пример:
Stream<Double> stream = DoubleStream.of(1, 2, 3).boxed(); UnaryOperator<Integer> unaryOperator = x -> x * 2; stream.map(unaryOperator).forEach(System.out::println);
Получаем ошибку компиляции, потому что map ожидает UnaryOperator<Double>
. Но помимо нормального решения, её можно обойти некоторыми извращенными способами. Например, заменив вызов map(unaryOperator) на map(x -> unaryOperator.apply(Integer.valueOf(x.intValue()))) (не делайте так никогда).
Method / Constructor References
По ссылкам на методы в дополнение к основным материалам также хороший материал есть на Oracle docs.
Гораздо больше можно запутаться в ссылках на конструкторы. Базовое объяснение довольно простое:
Supplier<String> supplier = () -> new String();
превращается в
Supplier<String> supplier = String::new;
Ну и вызываем:
String str = supplier.get();
Другого синтаксиса, например, String():new, String::new(«test«>) быть не может. Это вызовет ошибку компиляции. Но что, если в конструктор требуется передать аргументы? Supplier нам уже не подойдет, его метод T get() ничего не принимает.
Создаем свой (также можно воспользоваться Function):
interface SupplierWithArg<T, U> { T get(U arg); } SupplierWithArg<String, String> supplier = String::new; String str = supplier.get(“Java 8");
В данном случае синтаксис ссылки на конструктор никак не поменялся. Компилятор сам определил, какой конструктор класса String вызвать. В случае отсутствия подходящего конструктора, конечно же, будет ошибка компиляции.
А если аргумент параметризован? Например, у нас есть класс:
class Student { List<String> grades; public Student(List<String> grades) { this.grades = grades; } }
И функциональный интерфейс:
interface SupplierWithParamArg<T, U> { T get(List<U> arg); }
В данном случае Student::new не прокатит, компилятору нужно указать тип. Это можно сделать так:
List<String> grades = Arrays.asList("A", "B", “C"); SupplierWithParamArg<Student, String> supplier = Student::<String>new; Student student = supplier.get(grades);
Stream API
There are 95 methods in 23 classes that return a Stream
Many of them, though are intermediate operations in the Stream interface
71 methods in 15 classes can be used as practical Stream sources
(JDK 8 MOOC Lambdas and Streams)
Самое важное нововведение. Более половины вопросов будет именно об операциях со стримами. И также они будут фигурировать в вопросах на общие темы. Ключевым интерфейсом является Stream<T>
— он содержит практически все методы, которые будут упомянуты ниже.
Теперь о частых ошибках:
— Операции со стримами делятся на intermediate и terminal (в документации всегда можно увидеть, к какому типу относится метод);
— Для отработки стрима необходимы две вещи — source и terminal operation;
— Intermediate-операции «are lazy when possible». Они не выполняются, пока не потребуется результат.
Эти три пункта ведут к следующему:
List<StringBuilder> list = Arrays.asList(new StringBuilder("Java"), new StringBuilder(“Hello")); list.stream().map((x) -> x.append(" World”)); list.forEach(System.out::println);
Выведет:
Java
Hello
Не произошло абсолютно ничего, потому что map является intermediate-операцией, которая добавила преобразование и вернула новый стрим. Но без вызова terminal-операции мы просто «вяжем» свои вычисления до финального результата.
Стоит добавить любую terminal-операцию:
list.stream().map((x) -> x.append(" World”)).count(); // count возвращает кол-во элементов стрима.
и стрим отработает. Объекты листа будут изменены в:
Java World
Hello World
Стрим нельзя использовать повторно, если на нем отработала terminal-операция:
List<StringBuilder> list = Arrays.asList(new StringBuilder("Java"), new StringBuilder("Hello")); Stream<StringBuilder> stream = list.stream().map((x) -> x.append(" World")); long count = stream.count(); Object[] array = stream.toArray(); // java.lang.IllegalStateException
Обратите внимание, что метод close для интерфейса Stream не является terminal-операцией. Он идет от интерфейса AutoCloseable, который наследует BaseStream.
Специализированные версии стримов (DoubleStream, IntStream, LongStream) позволяют уйти от создания лишних объектов и autoboxing/unboxing. Мы работаем напрямую с примитивами. У интерфейса Stream есть соответствующие методы для преобразования — mapToXXX / flatMapToXXX. У специализированных версий метод boxed делает обратное — возвращает Stream<xxx>. Ещё у IntStream и LongStream есть интересные методы range и rangeClosed, генерирующие последовательность значений с шагом 1.
Интересную подборку частых ошибок при работе со стримами можно увидеть здесь.
Например, порядок операций и методы skip, limit:
IntStream.iterate(0, i -> i + 1) .limit(10) .skip(5) .forEach((x) -> System.out.print(x + " "));
Выведет: 5 6 7 8 9.
Меняем местами:
IntStream.iterate(0, i -> i + 1) .skip(5) .limit(10) .forEach((x) -> System.out.print(x + " "));
Получаем: 5 6 7 8 9 10 11 12 13 14.
Short-circuit operations
О чем стоит помнить на экзамене? Методы anyMatch, allMatch, noneMatch принимают Predicate и возвращают boolean. Также в названиях методов заложена механика их работы.
Stream<Integer> values = IntStream.rangeClosed(0, 10).boxed(); values.peek(System.out::println).anyMatch(x -> x == 5);
Будет выведена последовательность от 0 до 5. При x = 5 предикат вернет true, и стрим закончит работу.
Методы findFirst, findAny не принимают аргументов и возвращают Optional (потому что результата может и не быть).
C findAny не всё так просто:
Optional<Integer> result = IntStream.rangeClosed(10, 15) .boxed() .filter(x -> x > 12) .findAny(); System.out.println(result);
Казалось бы, данный код всегда выведет Optional с 13 внутри. Однако, findAny не гарантирует последовательности, он может выбрать любой элемент. Особенно это касается parallel-стримов (для производительности которых он был и создан). Для стабильного результата существует findFirst.
Reduction / Mutable Reduction
Самое простое по этой теме: методы min и max принимают Comparator и возвращают Optional.
За агрегирование результата отвечает reduce. Простейшая его версия принимает BinaryOperator (два аргумента — полученное на предыдущем шаге значение и текущее значение). Возвращает всегда одно значение для стрима, завернутое в Optional.
Например, max может быть заменен на:
.reduce((x, y) -> x > y ? x : y)
Или еще проще
.reduce(Integer::max)
Версия с корнем (identity) аккумулирует вычисление на основе типа корня:
T reduce(T identity, BinaryOperator<T> accumulator))
int sum = IntStream.range(0, 9).reduce(0, (x, y) -> x + y);
Mutable reduction позволяет не просто выдать результат, но и завернуть его в какой-нибудь контейнер (например, коллекцию). Для этого у стрима есть методы collect.
Стоит помнить, что collect в простейшей его версии принимает три аргумента:
<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
Supplier — возвращает новые инстансы целевого контейнера на текущем шаге.
Accumulator — собирает элементы в него.
Combiner — сливает контейнеры воедино.
Пример collect для ArrayList в роли контейнера:
List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Также был добавлен класс Collectors с множеством уже реализованных удобных операций. Рассмотрите его методы и хорошенько поиграйтесь в IDE. Например, по groupingBy вопросов будет достаточно. Пример:
List<String> list = Arrays.asList("Dave", "Kathy", "Ed", "John", "Fred"); Map<Integer, Long> data = list.stream() .collect(Collectors.groupingBy(String::length, Collectors.counting())); System.out.println(data);
Напоминает GROUP BY из SQL. Метод группирует значения по длине строки и данная его версия возвращает Map. Получаем вывод: {2=1, 4=3, 5=1}.
Ещё есть интересный метод partitioningBy. Он организует элементы согласно предикату в Map<Boolean, List<T>>
:
Stream<Integer> values = IntStream.rangeClosed(0, 10).boxed(); Object obj = values.collect(Collectors.partitioningBy(x -> x % 2 == 0)); System.out.println(obj);
Вывод:{false=[1, 3, 5, 7, 9], true=[0, 2, 4, 6, 8, 10]}
Parallel streams
По этой теме вопросов откровенно мало. Не волнуйтесь, вас и так будут спрашивать по многопоточности и Fork/Join Framework. По последнему может начаться настоящий трeш и угар. От простых вопросов: «Что это такое? Преимущества?» и «RecursiveTask vs RecursiveAction» до огромных полотен кода с сортировками массивов.
Под капотом параллельных стримов как раз и работает ForkJoinPool.
Для начала — методы parallel / sequential являются intermediate-операциями. С их помощью можно определять тип операций. Стрим может переходить из sequential в parallel и обратно. По-дефолту Collection.stream возвращает sequential-стрим.
List<Integer> list = IntStream.range(0, 256).boxed().collect(Collectors.toList()); int sum = list.stream() .filter(x -> x > 253) .parallel() .map(x -> x + 1) .sequential() .reduce(Integer::sum).orElse(0);
forEachOrdered наряду с forEach существует не просто так.
Например:
IntStream.range(0, 9).parallel().forEach(System.out::println)
Будут выведены числа от 0 до 8 в непредсказуемом порядке. Метод forEachOrdered заставит вывести их в натуральном порядке. Но он не сортирует данные (if the stream has a defined encounter order © JavaDoc).
Еще нюанс — далеко не факт, что параллельный стрим всегда заставит вычисления обрабатываться в разных потоках:
List<String> values = Arrays.asList("a", "b"); String join = values.parallelStream() .reduce("-", (x, y) -> x.concat(y)); System.out.println(join);
Если тут случится распараллеливание, и результат будет обрабатываться в двух разных потоках, на выходе получим —a-b. Каждый элемент по отдельности сольется с корнем, а затем всё сольется воедино. Но этого может и не произойти, тогда на первом шаге получим -a, а финальным результатом будет -ab.
Collections
Наиболее видимые изменения: Iterable и Map получили forEach. Обратите внимание, что для Map он принимает BiConsumer (два аргумента для ключа и значения):
Map<Integer, String> map = new HashMap<>(); map.put(1, "Joe"); map.put(2, "Bill"); map.put(3, "Kathy"); map.forEach((x, y) -> System.out.println(x + " " + y));
Кстати, можно вполне себе выводить, например, только значения. Не обязательно использовать все аргументы в выражении — map.forEach((x, y) -> System.out.println(y));
Далее, Collection получил stream() и parallelStream().
Могут попасться теоретические вопросы на тему работы HashMap. HashMap, LinkedHashMap, ConcurrentHashMap ведут себя иначе в Java 8. Грубо говоря, когда с хэшами беда и количество элементов связного списка в корзине переваливает за определенное значение, то список превращается в сбалансированное дерево. Об этом можно почитать, например, здесь или здесь.
Date and Time
Здесь придется углубиться в функционал новых классов. Duration манипулирует датами в разрезе часов/минут/секунд. Period использует дни/месяцы/годы. Где будет видна эта разница больше всего? При смещении временных диапазонов и переходом на летнее/зимнее время.
Например, в этом году в Украине переход на зимнее время состоялся 25 октября в 4 часа ночи (на час назад):
LocalDateTime ldt = LocalDateTime.of(2015, Month.OCTOBER, 25, 3, 0); ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("EET")); zdt = zdt.plus(Duration.ofDays(1)); System.out.println(zdt); zdt = ZonedDateTime.of(ldt, ZoneId.of("EET")); zdt = zdt.plus(Period.ofDays(1)); System.out.println(zdt);
Данный код выведет:
2015-10-26T02:00+02:00[EET]
2015-10-26T03:00+02:00[EET]
Что произошло? Duration добавил к дате конкретные 24 часа (потому что длительность одного дня всегда 24 часа). При переходе получаем на час меньше. Period же добавил конкретный день, и локальное время сохранилось.
I/O, NIO 2
Касаемо общих вопросов, стоит хорошо ориентироваться в операциях Path — normalize, relativize, resolve. А также StandardOpenOption. Но об этом будет достаточно в рекомендуемой литературе.
Теперь о Java 8. Вас могут ожидать не очень сложные вопросы про чтение и обработку текстового файла. В Files и BufferedReader появился метод lines(), возвращающий стрим, который состоит из строк выбранного файла.
Например, вывести строки:
Files.lines(Paths.get(“file.txt”)).forEach(System.out::println);
Или — разбить на слова, убрать дубликаты, перевести в нижний регистр и отсортировать по длине:
try (BufferedReader reader = Files.newBufferedReader( Paths.get("file.txt"), StandardCharsets.UTF_8)) { List<String> list = reader.lines() .flatMap(line -> Stream.of(line.split("[- .:,]+”))) .map(String::toLowerCase) .distinct() .sorted((w1, w2) -> w1.length() - w2.length()) .collect(Collectors.toList()); }
Кроме этого, в классе Files стримы также используют методы list, find и walk.
Заключение
Надеюсь, я смог немного раскрыть встречающиеся темы. К сожалению, исключительно из личного экзаменационного опыта нельзя описать всё возможное.
Еще несколько общих советов:
— Не нервничайте:). Вопросы в целом адекватные и без извращений. У Oracle нет цели завалить вас кривыми тестами;
— Также стоит следить за временем. На оба экзамена дается 2,5 часа. Лично у меня на OCA еще оставалось минут 40 на перепроверку, а вот в случае с OCP — около 15-ти;
— При подготовке посвящайте больше времени практике — это даст куда больше зазубривания книг. Открывайте IDE и пробуйте любые непонятные вещи.
Удачи!
Хочешь больше книг по программированию?
Подпишись на наш канал и ознакамливайся бесплатно!
Подписаться
×
Представляем вам статью Евгения Бережного, опубликованную на сайте DOU.UA.
Меня зовут Евгений и более 5 лет я занимался решениями в области Building Information Modelling (BIM), CAD- и CAE-решениями с использованием DSL DesignScript и Python. В 2014 году решил сменить профиль и заняться разработкой на Java. Успел поработать в области разработки и поддержки приложений для настройки компьютерных сетей и управления ими. Сейчас работаю Java-разработчиком в компании AB Soft (Одесса) и занимаюсь разработкой веб-приложений в предметной области облачных коммуникационных решений.
Идея получить сертификат Oracle Certified Professional: Java 11 Developer родилась в моей голове еще в далеком по меркам IT 2016 году, когда компания Oracle объявила о планах выпустить новую версию Java — 9-ю. Это и дало стимул пройти сертификацию и ознакомиться с новой версией языка. Но время шло, релиз был перенесен сначала на полгода, а потом и вовсе на вторую половину 2017-го. К тому же долгожданная Java 9 принесла с собой новую политику выпуска версий JDK с шестимесячным циклом выпуска Java, где релиз выходил каждые полгода, и следующим LTS (Long Term Support) — релизом стала Java 11. Так что пришлось ждать марта 2019 года, когда Oracle объявила о запуске новой Oracle Certified Professional: Java 11 Developer certification. Недолго думая, я решил пройти эту сертификационную программу, получить новый значок в коллекцию и поделиться опытом в этой статье.
Зачем вообще нужен сертификат?
Вопрос холиварный, как и вопрос, нужно ли программисту специальное высшее образование. С одной стороны, сертификат не дает никаких преимуществ. С другой стороны, его наличие может зацепить глаз HR, особенно в ситуации с разработчиками, которые пришли из другого языка или переквалифицируются из тестировщиков. Кроме того, наличие сертификата покажет, что вы умеете ставить цели и достигать их.
Моими стимулами были:
- желание расширить и консолидировать свои знания и понимание Java, включая те части API, которые редко используются в текущих задачах;
- изучить новшества долгожданных Java 9…11, чтобы быть готовым к будущему, которое обязательно наступит (смахнул скупую мужскую слезу, ковыряя проект на EJB3.0).
Можно, конечно, добиться этих целей и без сертификации, но тем, кто знаком со SMART и с принципом кнута (потеря денег за попытку сертификации) и пряника (документ и значок в коллекцию), нетрудно понять, что так обучение проходит гораздо эффективнее.
Получать сертификат или нет — личное дело каждого. В этой статье я лишь постарался дать свои рекомендации по подготовке к экзамену.
Немного из истории сертификации
Если бы вы сертифицировались по Java 8 и более ранним версиям, то могли сдавать два типа экзамена, каждый из которых давал соответствующий титул: Associate либо Professional. Теперь же появилось одно значительное изменение: титула Oracle Certified Associate (OCA) не существует, и сдача первого экзамена не даст вам ни сертификата, ни титула. То есть чтобы получить сертификат Oracle Certified Professional 11 (OCP 11), вы должны сдать оба экзамена: и Java 11 Programmer I (1Z0-815), и Java 11 Programmer II (1Z0-816). Они основаны на старых OCA 8 (1Z0-808) и OCP 8 (1Z0-809) соответственно.
Много об Oracle Certified Professional: Java 11 Programmer I (1Z0-815)
В этой статье речь пойдет о первом из необходимых экзаменов, Oracle Certified Professional: Java 11 Programmer I (1Z0-815). Подготовка заняла у меня около двух месяцев (по два-три часа в день). На тот момент в интернете было не так много информации о самом экзамене, а обучающей литературы нет и поныне. Поэтому я надеюсь, что мои мысли прольют свет на его самые важные особенности и помогут читателям с легкостью сдать его.
Экзамен сдается на английском, так что ваш уровень языка должен быть достаточным для понимания технической литературы (к слову, вся подготовительная литература написана на нем).
По сути, сам экзамен проверяет знание основ Java без глубокого погружения в отдельные API (IO, NIO 2.0, Concurrency, Stream и т. д.). В основном вам придется работать либо компилятором (указать, скомпилируется ли код), либо JRE (указать на результат выполнения кода или на то, какой Exception будет выброшен).
Но при этом даже опытным программистам не стоит расслабляться и игнорировать подготовку, потому что составители тестов будут пытаться поймать вас на банальной невнимательности, а это не так уж и трудно, учитывая, что в написании компилируемого кода нам помогает IDE.
Пример. Какой тип данных (x + y)?
double x = 39.21; float y = 2.1;
Правильный ответ: строчка float y = 2.1
не компилируется, так как нет символа f после 2.1.
Или же вас попросят рассказать о результате выполнения кода, присланного одним из ваших восточных коллег:
public class Test { public void print(Integer x) { System.out.print("Integer"); } public void print(float x) { System.out.print("float"); } public void print(Object x) { System.out.print("Object"); } public static void main(String[] args) { Test t = new Test(); short s = 123; t.print(s); t.print(true); t.print(6.789); } }
Думаю, многих удивит результат в виде floatObjectObject
.
И подобных вопросов в тесте хватает. Так что рекомендую как минимум сдать mock-тесты и подтянуть те темы, в которых вы могли бы совершить ошибку.
Несмотря на то что для подготовки к экзамену я использовал книгу OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 авторства Jeanne Boyarsky и Scott Selikoff, я не согласен с мнением авторов, утверждающих, что новый экзамен намного сложнее предыдущего ОСА 8 (1Z0-808). Так, например, я обнаружил всего несколько отличительных особенностей, которых не было в старом экзамене и книге OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808. Большинство из них — это фичи Java 9…11. Ниже я описал основные отличия новой версии экзамена от старой.
О чем необходимо помнить при сдаче экзамена Java 11 Programmer I?
- Теперь интерфейс имеет приватные методы экземпляра и приватные статические методы (новшество Java 9).
- Новый статический метод
List.of()
возвращает неизменяемый List и генерирует исключениеUnsupportedOperationException
в процессе выполнения, если вы попытаетесь его изменить (новшество Java 9). - Необходимо понимать особенности использования зарезервированного типа для локальных переменных
var
. Для этого рекомендую посмотреть официальное видео Oracle с 17-й минуты (новшество Java 10). - Нужно знать принцип работы и возвращаемое значение новых статических методов Arrays.mismatch и Arrays.compare (Java 9…11).
- Надо знать функциональный интерфейс Provider и то, что переменные, используемые в лямбда-выражениях, должны быть final или effectively final.
- Требуется быть знакомым с методом
StringBuilder.replace()
. - Необходимо знать, что делает специфический метод
String.intern()
. - Нужно разбираться в модульности Java, знать ее фишки и основные принципы. В частности, вам пригодится знание таких модулей JDK, как java.base, java.desktop, java.se, и инструментов jdeps, jmod, jlink. Также важно понимать, как скомпилировать и запустить приложение Java с помощью командной строки (Java 9).
- Разбираться в java.time (LocalDate, LocalDateTime и т. д.) особо не требуется. Вопросов на знание этого пакета не было, хотя он несколько раз упоминался в ходе экзамена, но на самом деле это были вопросы на знание правил импортирования пакетов. Поэтому главы, посвященные данному API в книге ОСА 8, по большему счету можно просмотреть поверхностно.
Большую часть времени я бы рекомендовал посвятить изучению модульности Java, поскольку более 10% вопросов будут именно о ней. В остальном вопросы на экзамене соответствуют приведенным в книгах по подготовке к старому экзамену OCA 8.
Немного о литературе для подготовки
Для общей подготовки я бы рекомендовала книгу OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 авторства Jeanne Boyarsky и Scott Selikoff либо OCA Java SE 8 Programmer I Exam Guide (Exams 1Z0-808) авторства Bert Bates и Kathy Sierra. Рекомендую обязательно практиковаться в mock-тестах, приведенных в книгах.
Для изучения модульности — Java 9 Modularity Book.
Достаточно ознакомиться с соответствующими разделами в документации Oracle JDK 11 Documentation, чтобы узнать все, что необходимо, о var, List.of, интерфейсе Provider, StringBuilder.replace, String.intern и новых методах класса Arrays.
О процедуре заказа и прохождения экзамена
Регистрируемся на Pearson VUE и Oracle CertView, связываем аккаунты, заказываем, оплачиваем и идем сдавать. Сертификационных центров в Одессе нет, но в Киеве их хватает. К тому же график их работы довольно гибкий, так что есть повод навестить столичных друзей/родственников 😉
Касательно процедуры сдачи экзамена. Если вы сдавали экзамен на права, то это что-то похожее, но только дольше. Прийти в центр надо за 15–20 минут до указанного времени. Все личные вещи нужно сдать в ячейку. Перед началом самого экзамена вас фотографируют, просят подписать несколько бумаг и проверяют ваши документы (в моем случае это внутренний и загранпаспорт). На экзамене вам выдают маркер и две ламинированные бумажки, на которых вы можете делать пометки. В процессе прохождения тестов можно помечать вопросы, чтобы вернуться к ним потом. Если вы выходите в уборную, то это происходит за счет времени экзамена (!).
Во время моей сдачи случилась примечательная ситуация: ближе к концу теста щелкнул свет, UPS не сработал, и компьютер ушел на перезагрузку, а мой мозг — в панический ступор 🙂
Но все данные уже были отправлены на сервер, и сессия сдачи экзамена продолжилась без учета времени, потраченного на перезагрузку ПК и вход в режим сдачи сессии.
Щепотка вдохновения
Результаты экзамена придут в течение 15 минут на вашу почту. Так что долго мучиться в догадках не придется. В целом экзамен имеет достаточно низкий проходной бал, поэтому после соответствующей подготовки, выполнения определенного количества mock-тестов и учета вышеизложенных советов и рекомендаций вы без труда получите результат, который вас удовлетворит.
Удачи и спасибо за внимание!
Improve Article
Save Article
Improve Article
Save Article
Friends! I recently appeared for OCA exam and scored 95%. Here i am sharing few techniques and exam question patterns which must be helping you while appearing for OCA test. This exam guarantee to ask question on the below topics or we can say statements.
Exam code: 1Z0-808
1. Must practice the differences between str1 == str2 and str1.equals(str2).
Example-1.1:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 =
"hello"
;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because String class equals method compare objects, but == operator only compares references. If both the references are pointing to the same object then only == operator returns true.
Example-1.2:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 = s;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because both the references are pointing to the same object so “==” printed and If both the reference are pointing to the same object so by default they the equal so “equals” printed.
2. Study ternary operator and its compile time errors.
Example-2.1:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
35
?
"Pass"
:
"Fail"
;
System.out.println(result);
}
}
Example-2.2:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
60
?
"Pass with 1st div."
: marks <
50
?
"Pass with 2nd div."
:
marks <
40
?
"Pass with 3nd div."
;
System.out.println(result);
}
}
OUTPUT: Compile Time Error
Reason: marks < 40 ? «Pass with 3nd div.» is not completed.
Correction: marks < 40 ? «Pass with 3nd div.»:”Fail” .
3. Study the rule “String objects are Immutable” .
Example-3.1:
class
Test {
public
static
void
main(String[] args)
{
String ta =
"A "
;
ta = ta.concat(
"B "
);
String tb =
"C "
;
ta = ta.concat(tb);
ta.replace(
'C'
,
'D'
);
ta = ta.concat(tb);
System.out.println(ta);
}
}
4. Lambda expression and its simplified forms.
Java Lambda Expression Syntax:
(argument-list) -> {body}
4.1 Lambda Expression Example: No Parameter
void
printHello()
{
System.out.println(
"Hello World "
);
}
Or
() -> { System.out.println(
"Hello World "
); };
Or
() -> System.out.println(
"Hello World "
);
4.2 Lambda Expression Example: Single Parameter
void
sayHello(String name)
{
System.out.println(
"Hello "
+ name);
}
Or
(name) -> { System.out.println(
"Hello "
+ name); };
Or
(name) -> System.out.println(
"Hello "
+ name);
Or
name -> System.out.println(
"Hello "
+ name);
4.3 Lambda Expression Example:Multiple Parameter
int
add(
int
num1,
int
num2)
{
return
num1 + num2;
}
Or
(
int
num1,
int
num2) -> {
return
num1 + num2; };
Or
(
int
num1,
int
num2) -> num1 + num2;
Or
(num1, num2) -> num1 + num2;
5. Study the difference between &(Bitwise AND) and &&(Logical AND) Operator.
Example-5.1:
class
Test {
public
static
void
main(String[] args)
{
int
a =
10
;
int
b =
20
;
if
(++a <=
10
&& --b <
20
) {}
System.out.println(
"Output of && operator: "
+
"a = "
+ a +
" b = "
+ b);
System.out.println(
"-------------"
);
a =
10
;
b =
20
;
if
(++a <=
10
& --b <
20
) {}
System.out.println(
"Output of & operator: "
+
"a = "
+ a +
" b = "
+ b);
}
}
Output:
Output of && operator: a = 11 b = 20 ------------- Output of & operator: a = 11 b = 19
Reason: Because ‘&&’ operator doesn’t check second operand if value for the first operand is ‘false’. But ‘&’ must check both the operands.
Note: These concept definitely covers 10 – 12 questions in OCA Exam.
Improve Article
Save Article
Improve Article
Save Article
Friends! I recently appeared for OCA exam and scored 95%. Here i am sharing few techniques and exam question patterns which must be helping you while appearing for OCA test. This exam guarantee to ask question on the below topics or we can say statements.
Exam code: 1Z0-808
1. Must practice the differences between str1 == str2 and str1.equals(str2).
Example-1.1:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 =
"hello"
;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because String class equals method compare objects, but == operator only compares references. If both the references are pointing to the same object then only == operator returns true.
Example-1.2:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 = s;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because both the references are pointing to the same object so “==” printed and If both the reference are pointing to the same object so by default they the equal so “equals” printed.
2. Study ternary operator and its compile time errors.
Example-2.1:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
35
?
"Pass"
:
"Fail"
;
System.out.println(result);
}
}
Example-2.2:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
60
?
"Pass with 1st div."
: marks <
50
?
"Pass with 2nd div."
:
marks <
40
?
"Pass with 3nd div."
;
System.out.println(result);
}
}
OUTPUT: Compile Time Error
Reason: marks < 40 ? «Pass with 3nd div.» is not completed.
Correction: marks < 40 ? «Pass with 3nd div.»:”Fail” .
3. Study the rule “String objects are Immutable” .
Example-3.1:
class
Test {
public
static
void
main(String[] args)
{
String ta =
"A "
;
ta = ta.concat(
"B "
);
String tb =
"C "
;
ta = ta.concat(tb);
ta.replace(
'C'
,
'D'
);
ta = ta.concat(tb);
System.out.println(ta);
}
}
4. Lambda expression and its simplified forms.
Java Lambda Expression Syntax:
(argument-list) -> {body}
4.1 Lambda Expression Example: No Parameter
void
printHello()
{
System.out.println(
"Hello World "
);
}
Or
() -> { System.out.println(
"Hello World "
); };
Or
() -> System.out.println(
"Hello World "
);
4.2 Lambda Expression Example: Single Parameter
void
sayHello(String name)
{
System.out.println(
"Hello "
+ name);
}
Or
(name) -> { System.out.println(
"Hello "
+ name); };
Or
(name) -> System.out.println(
"Hello "
+ name);
Or
name -> System.out.println(
"Hello "
+ name);
4.3 Lambda Expression Example:Multiple Parameter
int
add(
int
num1,
int
num2)
{
return
num1 + num2;
}
Or
(
int
num1,
int
num2) -> {
return
num1 + num2; };
Or
(
int
num1,
int
num2) -> num1 + num2;
Or
(num1, num2) -> num1 + num2;
5. Study the difference between &(Bitwise AND) and &&(Logical AND) Operator.
Example-5.1:
class
Test {
public
static
void
main(String[] args)
{
int
a =
10
;
int
b =
20
;
if
(++a <=
10
&& --b <
20
) {}
System.out.println(
"Output of && operator: "
+
"a = "
+ a +
" b = "
+ b);
System.out.println(
"-------------"
);
a =
10
;
b =
20
;
if
(++a <=
10
& --b <
20
) {}
System.out.println(
"Output of & operator: "
+
"a = "
+ a +
" b = "
+ b);
}
}
Output:
Output of && operator: a = 11 b = 20 ------------- Output of & operator: a = 11 b = 19
Reason: Because ‘&&’ operator doesn’t check second operand if value for the first operand is ‘false’. But ‘&’ must check both the operands.
Note: These concept definitely covers 10 – 12 questions in OCA Exam.
Friends! I recently appeared for OCA exam and scored 95%. Here i am sharing few techniques and exam question patterns which must be helping you while appearing for OCA test. This exam guarantee to ask question on the below topics or we can say statements.
Exam code: 1Z0-808
1. Must practice the differences between str1 == str2 and str1.equals(str2).
Example-1.1:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 =
"hello"
;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because String class equals method compare objects, but == operator only compares references. If both the references are pointing to the same object then only == operator returns true.
Example-1.2:
class
Test {
public
static
void
main(String[] args)
{
String s =
new
String(
"hello"
);
String s2 = s;
if
(s == s2) {
System.out.println(
"=="
);
}
if
(s.equals(s2)) {
System.out.println(
"equals"
);
}
}
}
Reason: Because both the references are pointing to the same object so “==” printed and If both the reference are pointing to the same object so by default they the equal so “equals” printed.
2. Study ternary operator and its compile time errors.
Example-2.1:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
35
?
"Pass"
:
"Fail"
;
System.out.println(result);
}
}
Example-2.2:
class
Test {
public
static
void
main(String[] args)
{
int
marks =
90
;
String result = marks >
60
?
"Pass with 1st div."
: marks <
50
?
"Pass with 2nd div."
:
marks <
40
?
"Pass with 3nd div."
;
System.out.println(result);
}
}
OUTPUT: Compile Time Error
Reason: marks < 40 ? «Pass with 3nd div.» is not completed.
Correction: marks < 40 ? «Pass with 3nd div.»:”Fail” .
3. Study the rule “String objects are Immutable” .
Example-3.1:
class
Test {
public
static
void
main(String[] args)
{
String ta =
"A "
;
ta = ta.concat(
"B "
);
String tb =
"C "
;
ta = ta.concat(tb);
ta.replace(
'C'
,
'D'
);
ta = ta.concat(tb);
System.out.println(ta);
}
}
4. Lambda expression and its simplified forms.
Java Lambda Expression Syntax:
(argument-list) -> {body}
4.1 Lambda Expression Example: No Parameter
void
printHello()
{
System.out.println(
"Hello World "
);
}
Or
() -> { System.out.println(
"Hello World "
); };
Or
() -> System.out.println(
"Hello World "
);
4.2 Lambda Expression Example: Single Parameter
void
sayHello(String name)
{
System.out.println(
"Hello "
+ name);
}
Or
(name) -> { System.out.println(
"Hello "
+ name); };
Or
(name) -> System.out.println(
"Hello "
+ name);
Or
name -> System.out.println(
"Hello "
+ name);
4.3 Lambda Expression Example:Multiple Parameter
int
add(
int
num1,
int
num2)
{
return
num1 + num2;
}
Or
(
int
num1,
int
num2) -> {
return
num1 + num2; };
Or
(
int
num1,
int
num2) -> num1 + num2;
Or
(num1, num2) -> num1 + num2;
5. Study the difference between &(Bitwise AND) and &&(Logical AND) Operator.
Example-5.1:
class
Test {
public
static
void
main(String[] args)
{
int
a =
10
;
int
b =
20
;
if
(++a <=
10
&& --b <
20
) {}
System.out.println(
"Output of && operator: "
+
"a = "
+ a +
" b = "
+ b);
System.out.println(
"-------------"
);
a =
10
;
b =
20
;
if
(++a <=
10
& --b <
20
) {}
System.out.println(
"Output of & operator: "
+
"a = "
+ a +
" b = "
+ b);
}
}
Output:
Output of && operator: a = 11 b = 20 ------------- Output of & operator: a = 11 b = 19
Reason: Because ‘&&’ operator doesn’t check second operand if value for the first operand is ‘false’. But ‘&’ must check both the operands.
Note: These concept definitely covers 10 – 12 questions in OCA Exam.