Java 8 Flashcards
Что нового в Java 8
Лямбдавыражения, default в выражениях, ссылки на методы, функциональные интерфейсы, stream, Nashorn
Как отсортировать список строк с помощью лямбда выражения
movies.sort(new Comparator() { @Override public int compare(Movie m1, Movie m2) { if(m1.getStarred() == m2.getStarred()){ return 0; } return m1.getStarred() ? -1 : 1; } });
Что такое лямбда выражение
Лямбда-выражение представляет собой блок кода, который можно передать в другое место, поэтому он может быть выполнен позже, один или несколько раз.
(аргументы)->{тело метода}
(String firstStr, String secondStr)
-> Integer.compare(firstStr.length(),secondStr.length())
a->a+a///скобки сможно опускать
Ссылки на метод
Arrays.sort(strs, String::compareToIgnoreCase)
strs это перменная, String класс, compareToIgnoreCase это метод стринга
другие примеры:
button.setOnAction(System.out::println);
Expression expr = ExpressionHelper::isPositive;
UserBuilder userBuilder = User::new;//ссылка на constructor
функциональные интерфейсы что такое какие что делают
Вы можете поставить лямбда-выражение всякий раз, когда ожидается объект интерфейса с одним абстрактным методом. Такой интерфейс называется функциональным интерфейсом.
@FunctionalInterface public interface GaMechanic { void new_deck(); default int deal_cards(int num_of_players) { // тело метода } default int check_your_cards(int[] hand) { //... } default int battle(Card player1_Card, Card player2_Card) { //... } }
default методы и как вызвать
Разработчики языка создали методы интерфейса с конкретной реализацией (так называемые методы по умолчанию). Эти методы могут быть безопасно добавлены к существующим интерфейсам….т.е мы теперь можем реализовать методы прямо в интерфейсе
вызывать в реализуюзем классе class Student implements Person, Naming { public String getFirstName() {return Person.super.getFirstName(); }}
static методы и как вызвать
Статические методы похожи на методы по умолчанию, за исключением того, что мы не можем переопределить их в классах, реализующих интерфейс.
Статические методы в интерфейсе хороши для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т.д.
что такое stream
функциональный стиль работы со структурами данных. Java Stream API предлагает два вида методов: 1. Конвейерные — возвращают другой stream, то есть работают как builder,
2. Терминальные — возвращают другой объект, такой как коллекция, примитивы, объекты, Optional и т.д.
зачем метод collect в java 8
Представление результатов в виде коллекций и других структур данных .collect(Collectors.toList())
foreach в stream
Применяет функцию к каждому объекту стрима, порядок при параллельном выполнении не гарантируется
map в stream
Преобразует каждый элемент стрима
collection.stream().map((s) -> s + “_1”).collect(Collectors.toList())
distinct в stream
Возвращает стрим без дубликатов (для метода equals)
collection.stream().distinct().collect(Collectors.toList())
filter в stream
filter(«a1»::equals) отфильтровывает
параллельная обработка в java8
paralellSort, paralellStream
optional
Контейнер для значения с возможным null
nashnorn
движок JavaScript, разрабатываемый полностью на языке программирования Java компанией Oracle для более дешевой реализации логики через дешевых программистов и
peek в stream
Возвращает тот же стрим, но применяет функцию к каждому элементу стрима
Base64
Стандарт кодирования двоичных данных при помощи только 64 символов ASCII.
построчно прочесть файл
Files.lines(Paths.get(FILE_NAME), StandardCharsets.UTF_8).forEach(System.out::println);
CSV файлы
CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация:
Каждая строка файла — это одна строка таблицы.
Разделителем (англ. delimiter) значений колонок является символ запятой (,). Однако на практике часто используются другие разделители, то есть формат путают с DSVruen и TSV (см. ниже).
Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками (“). Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.
пример
1997,Ford,E350,”ac, abs, moon”,3000.00
1999,Chevy,”Venture «Extended Edition»”,”“,4900.00
1996,Jeep,Grand Cherokee,”MUST SELL! air, moon roof, loaded”,4799.00
try (Stream stream = Files.lines(Paths.get(txtFileName))) {
stream.forEach(System.out::println);
} catch (IOException ioe) {ioe.printStackTrace();}
Сложность алгоритмов
оценивают по времени выполнения или по используемой памяти. При этом точное время мало кого интересует: оно зависит от процессора, типа данных, языка программирования и множества других параметров. Важна лишь асимптотическая сложность, т. е. сложность при стремлении размера входных данных к бесконечности.
O(n) — линейная сложность. Такой сложностью обладает, например, алгоритм поиска наибольшего элемента в не отсортированном массиве. Нам придётся пройтись по всем n элементам массива, чтобы понять, какой из них максимальный.
O(log n) — логарифмическая сложность
Простейший пример — бинарный поиск. Если массив отсортирован, мы можем проверить, есть ли в нём какое-то конкретное значение, методом деления пополам. Проверим средний элемент, если он больше искомого, то отбросим вторую половину массива — там его точно нет. Если же меньше, то наоборот — отбросим начальную половину. И так будем продолжать делить пополам, в итоге проверим log n элементов
O(n2) — квадратичная сложность Такую сложность имеет, например, алгоритм сортировки вставками. В канонической реализации он представляет из себя два вложенных цикла: один, чтобы проходить по всему массиву, а второй, чтобы находить место очередному элементу в уже отсортированной части. Таким образом, количество операций будет зависеть от размера массива как n * n, т. е. n2.
Также случается, что время работы алгоритма вообще не зависит от размера входных данных. Тогда сложность обозначают как O(1).
stream.reduce
Позволяет выполнять агрегатные функции на всей коллекцией и возвращать один результат
collection.stream().reduce((s1, s2) -> s1 + s2).orElse(0)
Предикаты
Предикаты — это функции, принимающие один аргумент, и возвращающие значение типа boolean. Интерфейс содержит различные методы по умолчанию,
Predicate predicate = (s) -> s.length() > 0;
predicate. test(“foo”); // true
predicate. negate().test(“foo”); // false
Predicate nonNull = Objects::nonNull;
Predicate isNull = Objects::isNull;
Predicate isEmpty = String::isEmpty;
Predicate isNotEmpty = isEmpty.negate();
Функции
Функции принимают один аргумент и возвращают некоторый результат. Методы по умолчанию могут использоваться для построения цепочек вызовов (compose, andThen).
Function toInteger = Integer::valueOf;
Function backToString = toInteger.andThen(String::valueOf);
backToString.apply(“123”); // “123”
Поставщики(Supplier)
Supplier personSupplier = Person::new;
personSupplier.get(); // new Person
предоставляют результат заданного типа. В отличии от функций, поставщики не принимают аргументов.
Потребители(consumers)
Потребители (consumers) представляют собой операции, которые производятся на одним входным аргументом.
Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName); greeter.accept(new Person("Luke", "Skywalker"));
API для работы с датами
Тип Clock предоставляет доступ к текущей дате и времени. Этот тип знает о часовых поясах и может использоваться вместо вызова System.currentTimeMillis() для возвращения миллисекунд. Такая точная дата также может быть представлена классом Instant. Объекты этого класса могут быть использованы для создания объектов устаревшего типа java.util.Date.
Clock clock = Clock.systemDefaultZone();
long millis = clock.millis();
Instant instant = clock.instant();
Date legacyDate = Date.from(instant); // legacy java.util.Date
Часовые пояса представлены типом ZoneId. Доступ к ним можно получить при помощи статических фабричных методов. Часовые пояса содержат смещения, которые важны для конвертации дат и времени в местные. System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids
ZoneId zone1 = ZoneId.of(“Europe/Berlin”);
ZoneId zone2 = ZoneId.of(“Brazil/East”);
System.out.println(zone1.getRules());
System.out.println(zone2.getRules());
// ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
Тип LocalTime представляет собой время с учетом часового пояса, например, 10pm или 17:30:15. В следующем примере создаются два местных времени для часовых поясов, определенных выше. Затем оба времени сравниваются, и вычисляется разница между ними в часах и минутах.
LocalTime now1 = LocalTime.now(zone1);
LocalTime now2 = LocalTime.now(zone2);
System.out.println(now1.isBefore(now2)); // false
long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);
System.out.println(hoursBetween); // -3
System.out.println(minutesBetween);
Тип LocalDate представляет конкретную дату, например, 2014-03-11. Объекты LocalDate неизменяемы и являются аналогом LocalTime. Пример демонстрирует вычисление новой даты путем сложения или вычитания дней, месяцев или годов. Помните, что каждая операция возвращает новый экземпляр.
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);
LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
System.out.println(dayOfWeek); // FR
Аннотации вJAVA8
Аннотации в Java 8 являются повторяемыми. Сперва мы определим аннотацию-обертку, которая содержит массив аннотаций:
@interface Hints {
Hint[] value();
}
@Repeatable(Hints.class) @interface Hint { String value(); } Java 8 позволяет нам использовать множество аннотаций одного типа путем указания аннотации @Repeatable.
Вариант 1: использовать аннотацию-контейнер (старый способ) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}
Вариант 2: использовать повторяемую аннотацию (новый способ) @Hint("hint1") @Hint("hint2") class Person {}
При использовании варианта 2 компилятор автоматически подставляет аннотацию @Hints. Это важно при чтении информации об аннотациях через рефлексию.