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”