Java 8 Flashcards

1
Q

Что нового в Java 8

A

Лямбдавыражения, default в выражениях, ссылки на методы, функциональные интерфейсы, stream, Nashorn

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

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

A
movies.sort(new Comparator() {
   @Override
   public int compare(Movie m1, Movie m2) {
       if(m1.getStarred() == m2.getStarred()){
           return 0;
       }
       return m1.getStarred() ? -1 : 1;
    }
});
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое лямбда выражение

A

Лямбда-выражение представляет собой блок кода, который можно передать в другое место, поэтому он может быть выполнен позже, один или несколько раз.

(аргументы)->{тело метода}

(String firstStr, String secondStr)
-> Integer.compare(firstStr.length(),secondStr.length())

a->a+a///скобки сможно опускать

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Ссылки на метод

A

Arrays.sort(strs, String::compareToIgnoreCase)

strs это перменная, String класс, compareToIgnoreCase это метод стринга

другие примеры:
button.setOnAction(System.out::println);
Expression expr = ExpressionHelper::isPositive;
UserBuilder userBuilder = User::new;//ссылка на constructor

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

функциональные интерфейсы что такое какие что делают

A

Вы можете поставить лямбда-выражение всякий раз, когда ожидается объект интерфейса с одним абстрактным методом. Такой интерфейс называется функциональным интерфейсом.

@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)
{
//...
}
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

default методы и как вызвать

A

Разработчики языка создали методы интерфейса с конкретной реализацией (так называемые методы по умолчанию). Эти методы могут быть безопасно добавлены к существующим интерфейсам….т.е мы теперь можем реализовать методы прямо в интерфейсе

вызывать в реализуюзем классе
class Student implements Person, Naming {
    public String getFirstName() {return Person.super.getFirstName(); }}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

static методы и как вызвать

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

что такое stream

A

функциональный стиль работы со структурами данных. Java Stream API предлагает два вида методов: 1. Конвейерные — возвращают другой stream, то есть работают как builder,
2. Терминальные — возвращают другой объект, такой как коллекция, примитивы, объекты, Optional и т.д.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

зачем метод collect в java 8

A

Представление результатов в виде коллекций и других структур данных .collect(Collectors.toList())

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

foreach в stream

A

Применяет функцию к каждому объекту стрима, порядок при параллельном выполнении не гарантируется

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

map в stream

A

Преобразует каждый элемент стрима

collection.stream().map((s) -> s + “_1”).collect(Collectors.toList())

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

distinct в stream

A

Возвращает стрим без дубликатов (для метода equals)

collection.stream().distinct().collect(Collectors.toList())

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

filter в stream

A

filter(«a1»::equals) отфильтровывает

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

параллельная обработка в java8

A

paralellSort, paralellStream

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

optional

A

Контейнер для значения с возможным null

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

nashnorn

A

движок JavaScript, разрабатываемый полностью на языке программирования Java компанией Oracle для более дешевой реализации логики через дешевых программистов и

17
Q

peek в stream

A

Возвращает тот же стрим, но применяет функцию к каждому элементу стрима

18
Q

Base64

A

Стандарт кодирования двоичных данных при помощи только 64 символов ASCII.

19
Q

построчно прочесть файл

A

Files.lines(Paths.get(FILE_NAME), StandardCharsets.UTF_8).forEach(System.out::println);

20
Q

CSV файлы

A

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();}

21
Q

Сложность алгоритмов

A

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

O(n) — линейная сложность. Такой сложностью обладает, например, алгоритм поиска наибольшего элемента в не отсортированном массиве. Нам придётся пройтись по всем n элементам массива, чтобы понять, какой из них максимальный.

O(log n) — логарифмическая сложность
Простейший пример — бинарный поиск. Если массив отсортирован, мы можем проверить, есть ли в нём какое-то конкретное значение, методом деления пополам. Проверим средний элемент, если он больше искомого, то отбросим вторую половину массива — там его точно нет. Если же меньше, то наоборот — отбросим начальную половину. И так будем продолжать делить пополам, в итоге проверим log n элементов

O(n2) — квадратичная сложность Такую сложность имеет, например, алгоритм сортировки вставками. В канонической реализации он представляет из себя два вложенных цикла: один, чтобы проходить по всему массиву, а второй, чтобы находить место очередному элементу в уже отсортированной части. Таким образом, количество операций будет зависеть от размера массива как n * n, т. е. n2.

Также случается, что время работы алгоритма вообще не зависит от размера входных данных. Тогда сложность обозначают как O(1).

22
Q

stream.reduce

A

Позволяет выполнять агрегатные функции на всей коллекцией и возвращать один результат
collection.stream().reduce((s1, s2) -> s1 + s2).orElse(0)

23
Q

Предикаты

A

Предикаты — это функции, принимающие один аргумент, и возвращающие значение типа 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();

24
Q

Функции

A

Функции принимают один аргумент и возвращают некоторый результат. Методы по умолчанию могут использоваться для построения цепочек вызовов (compose, andThen).

Function toInteger = Integer::valueOf;
Function backToString = toInteger.andThen(String::valueOf);

backToString.apply(“123”); // “123”

25
Q

Поставщики(Supplier)

A

Supplier personSupplier = Person::new;
personSupplier.get(); // new Person
предоставляют результат заданного типа. В отличии от функций, поставщики не принимают аргументов.

26
Q

Потребители(consumers)

A

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

Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));
27
Q

API для работы с датами

A

Тип 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

28
Q

Аннотации вJAVA8

A

Аннотации в 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. Это важно при чтении информации об аннотациях через рефлексию.