SlideShare ist ein Scribd-Unternehmen logo
1 von 69
Java 8 Puzzlers
Чуваки вы кто?
Agenda
История про забытые яйца
Что выведет следующий код?
A. молоко/хлеб/колбаса
B. молоко/хлеб/колбаса/яйца, яйца ещё!
C. молоко/хлеб/колбаса/ConcurrentModificationException
D. ConcurrentModificationException
List<String> list = new ArrayList<>();
list.add("молоко");
list.add("хлеб");
list.add("колбаса");
Stream<String> stream = list.stream();
list.add("яйца, яйца ещё!");
stream.forEach(System.out::println);
Объяснение тут
• Late binding же
List<String> list = new ArrayList<>();
list.add("молоко");
list.add("хлеб");
list.add("колбаса");
Stream<String> stream = list.stream();
list.add("яйца, яйца ещё!");
stream.forEach(System.out::println);
колбасы не надо
Что выведет следующий код?
A. молоко/хлеб/колбаса
B. молоко/хлеб/колбаса/яйца, яйца ещё!
C. молоко/хлеб/колбаса/ConcurrentModificationException
D. молоко/хлеб/яйца, яйца ещё!
List<String> list = new ArrayList<String>();
list.add("молоко");
list.add("хлеб");
list.add("колбаса");
list = list.subList(0, 2); //не надо колбасу!
Stream<String> stream = list.stream();
list.add("яйца, яйца ещё!");
stream.forEach(System.out::println);
• Баг!!!
Сага о палаче
В чём разница между строчками 1 и 2?
A. 1 компилируется, 2 нет
B. 2 компилируется, 1 нет
C. Что в лоб, что по лбу, обе нормально сработают.
D. Без разницы, обе не компилируются.
public void killAll(){
ExecutorService ex = Executors.newSingleThreadExecutor();
List<String> sentence = Arrays.asList("Казнить");
ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1
ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2
}
Да ну на…
В чём разница между строчками 1 и 2?
A. 1 компилируется, 2 нет
B. 2 компилируется, 1 нет
C. Что в лоб, что по лбу, обе нормально сработают.
D. Без разницы, обе не компилируются.
public void killAll(){
ExecutorService ex = Executors.newSingleThreadExecutor();
List<String> sentence = Arrays.asList("Казнить");
ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1
ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2
}
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
public void killAll(){
ExecutorService ex = Executors.newSingleThreadExecutor();
List<String> sentence = Arrays.asList("Казнить");
ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1
ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2
}
Безумный max
Что будет?
A. Ошибка компиляции
B. Вылетит с исключением
C. 3
D. Что−то другое
System.out.println(
Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
);
Что будет?
A. −3
B. −1
C. 0
D. 1
D. Что−то другое:
System.out.println(
Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
);
• Math.max(−3, −2) = −2 < 0  −3 < −2, берём −2
• Math.max(−2, −1) = −1 < 0  −2 < −1, берём −1
• Math.max(−1, 0) = 0  −1 == 0, оставляем −1
• Math.max(−1, 1) = 1 > 0  −1 > 1, оставляем −1
• Math.max(−1, 2) = 2 > 0  −1 > 2, оставляем −1
• Math.max(−1, 3) = 3 > 0  −1 > 3, оставляем −1
Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
Настало время апгрейда
Что произойдёт после выполнения?
A. Мапы поменяются местами
B. Обе станут олдскульными
C. Обе станут как надо
D. Поучитесь программировать! Это вообще не скомпилируется!
Map<String, String> oldSchool = initOldSchool();
// oldSchool = {buildTool=maven, lang=java, IOC=jee}
Map<String, String> proper = initКакНадо();
// proper = {buildTool=gradle, lang=groovy, IOC=spring}
oldSchool.replaceAll(proper::put);
void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
V put(K key, V value);
Map interface
oldSchool.replaceAll(proper::put);
Одинаково ли сработают три способа?
List<String> list = Arrays.asList("Вронский", "Поезд", "Анна");
Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(list, cmp));
System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get());
System.out.println(list.stream().max(cmp).get());
A. Все ответы будут одинаковые
B. Будет два разных ответа
C. Будет три разных ответа
D. Будет четыре разных ответа
А в чём тут был
паззлер?
А теперь?
A. Все ответы будут одинаковые
B. Будет два разных ответа
C. Будет три разных ответа
D. Будет четыре разных ответа
List<String> list = Arrays.asList("Вронский", null, "Анна");
Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(list, cmp));
System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get());
System.out.println(list.stream().max(cmp).get());
Вот теперь убиться
Объяснение тут
• null
• NoSuchElementException
• NullPointerException
List<String> list = Arrays.asList("Вронский", null, "Анна");
Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(list, cmp));
System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get());
System.out.println(list.stream().max(cmp).get());
Мутанты
Как сделать тип, не объявляя его?
interface Кот{ default void мяукать() {System.out.println("мяу");}}
interface Пёс{ default void лаять() {System.out.println("гав");}}
public static void main(String[] args) {
class Котопёс implements Кот, Пёс {}
test(new Котопёс());
}
static void test(Object obj) {
def x = (?)obj;
x.мяукать();
x.лаять();
}
interface Кот{ default void мяукать() {System.out.println("мяу");}}
interface Пёс{ default void лаять() {System.out.println("гав");}}
public static void main(String[] args) {
class Котопёс implements Кот, Пёс {}
test(new Котопёс());
}
Какой вариант сработает?
static void test(Object obj) {
// A. Это сработает?
Кот & Пёс x = (Кот & Пёс) obj;
x.мяукать();
x.лаять();
}
static void test(Object obj) {
// B. Это сработает?
((Consumer<? extends Кот & Пёс>)(x -> {
x.мяукать();
x.лаять();
})).accept((Кот & Пёс)obj); }
static void test(Object obj) {
// C. Это сработает?
Optional.of((Кот & Пёс) obj)
.ifPresent(x -> {
x.мяукать();
x.лаять();
});}
// D. Да вы упоролись, в моей Джаве такого не бывает!
А как это вообще работает???
static void test(Object obj) {
Optional.of((Кот & Пёс) obj)
.ifPresent(x -> {
x.мяукать();
x.лаять();
});}
Кто быстрее?
Кто быстрее?
IntStream.range(0, 100_000_000)
.skip(99_000_000)
.sum();
IntStream.range(0, 100_000_000)
.parallel()
.skip(99_000_000)
.sum();
A. Параллельный быстрее конечно, причем сильно
B. Параллельный медленнее
C. По фигу, одинаково будет
D. Exception
parallel().skip()
• API Note: While skip() is generally a cheap operation on sequential
stream pipelines, it can be quite expensive on ordered parallel
pipelines, especially for large values of n, since skip(n) is constrained
to skip not just any n elements, but the first n elements in the
encounter order.
parallel().skip()
• API Note: While skip() is generally a cheap operation on sequential
stream pipelines, it can be quite expensive on ordered parallel
pipelines, especially for large values of n, since skip(n) is constrained
to skip not just any n elements, but the first n elements in the
encounter order.
parallel().skip()
• API Note: While skip() is generally a cheap operation on sequential
stream pipelines, it can be quite expensive on ordered parallel
pipelines, especially for large values of n, since skip(n) is constrained
to skip not just any n elements, but the first n elements in the
encounter order.
parallel().skip()
• API Note: While skip() is generally a cheap operation on sequential
stream pipelines, it can be quite expensive on ordered parallel
pipelines, especially for large values of n, since skip(n) is constrained
to skip not just any n elements, but the first n elements in the
encounter order.
parallel(): trySplit()
parallel(): trySplit()
IntStream.range(0, 100_000_000)
.skip(1)
.toArray();
Где больше вероятность на OutOfMemory?
IntStream.range(0, 100_000_000)
.toArray();
A. 1
B. 2
C. Одинаково
D. Будет другой Exception
1) 2)
IntStream.range(0, 100_000_000)
.skip(1)
.toArray();
Где больше вероятность на OutOfMemory?
IntStream.range(0, 100_000_000)
.toArray();
A. 1
B. 2
C. Одинаково
D. Будет другой Exception
1) 2)
Трудности перевода
Что выведет?
A. ПРИВЕТ/ПРИВЕТ
B. ПРИВЕТ/HELLO
C. HELLO/ПРИВЕТ
D. HELLO/HELLO
public class Test {
String str;
void run() {
str = "привет";
Supplier<String> s1 = str::toUpperCase;
Supplier<String> s2 = () -> str.toUpperCase();
str = "hello";
System.out.println(s1.get());
System.out.println(s2.get());
}
}
public class Test {
String str;
void run() {
str = "привет";
Supplier<String> s1 = str::toUpperCase;
Supplier<String> s2 = () -> str.toUpperCase();
str = "hello";
System.out.println(s1.get());
System.out.println(s2.get());
}
}
Что произойдёт?
A. ConcurrentModificationException
B. ArrayIndexOutOfBoundsException
C. NullPointerException
D. Успешно завершится
List<String> list = new ArrayList<>(Arrays.asList("Arne", "Chuck", "Slay"));
list.stream().forEach(x -> {
if(x.equals("Chuck")) {
list.remove(x);
}
});
Объяснение тут
• stream().forEach()  spliterator().forEachRemaining()
• forEachRemaining проверяет modcount один раз в конце
• Удаление элемента приведёт к сдвигу массива с добавлением null
в конце:
[“Arne”, “Chuck”, “Slay”]  [“Arne”, “Slay”, null]
• На последней итерации if(null.equals(“Chuck”)) упадёт с NPE (до
CME не дожили)
• Используйте list.removeIf(“Chuck”::equals);
Выводы
1. Пишите читабельный код
2. Комментируйте все трюки
3. Иногда это баг
4. Пользуйтесь Интелиджей
5. Читайте документацию
Главный вывод
А Груви не так уж плох…
Понравилось?
Хвалите нас в твиттере!
#JAVA8PUZZLERS
-
Не понравилось?
/ dev / null
Спасибо за вклад
Спасибо за призы
XP Injection
infopulse
Java 8 puzzlers

Weitere ähnliche Inhalte

Was ist angesagt?

Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream APICEE-SEC(R)
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 

Was ist angesagt? (20)

Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Spring puzzlers
Spring puzzlersSpring puzzlers
Spring puzzlers
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Thread
ThreadThread
Thread
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 

Andere mochten auch

Let if flow: Java 8 Streams puzzles and more
Let if flow: Java 8 Streams puzzles and moreLet if flow: Java 8 Streams puzzles and more
Let if flow: Java 8 Streams puzzles and moreBhakti Mehta
 
How Immutability Helps in OOP
How Immutability Helps in OOPHow Immutability Helps in OOP
How Immutability Helps in OOPYegor Bugayenko
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке Evgeny Borisov
 
Javaeeconf 2016 how to cook apache kafka with camel and spring boot
Javaeeconf 2016 how to cook apache kafka with camel and spring bootJavaeeconf 2016 how to cook apache kafka with camel and spring boot
Javaeeconf 2016 how to cook apache kafka with camel and spring bootIvan Vasyliev
 
Java 8 Puzzlers [as presented at OSCON 2016]
Java 8 Puzzlers [as presented at  OSCON 2016]Java 8 Puzzlers [as presented at  OSCON 2016]
Java 8 Puzzlers [as presented at OSCON 2016]Baruch Sadogursky
 
JEEConf 2016. Effectiveness and code optimization in Java applications
JEEConf 2016. Effectiveness and code optimization in  Java applicationsJEEConf 2016. Effectiveness and code optimization in  Java applications
JEEConf 2016. Effectiveness and code optimization in Java applicationsStrannik_2013
 

Andere mochten auch (9)

Spring the ripper
Spring the ripperSpring the ripper
Spring the ripper
 
Let if flow: Java 8 Streams puzzles and more
Let if flow: Java 8 Streams puzzles and moreLet if flow: Java 8 Streams puzzles and more
Let if flow: Java 8 Streams puzzles and more
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
How Immutability Helps in OOP
How Immutability Helps in OOPHow Immutability Helps in OOP
How Immutability Helps in OOP
 
Spock
SpockSpock
Spock
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке
 
Javaeeconf 2016 how to cook apache kafka with camel and spring boot
Javaeeconf 2016 how to cook apache kafka with camel and spring bootJavaeeconf 2016 how to cook apache kafka with camel and spring boot
Javaeeconf 2016 how to cook apache kafka with camel and spring boot
 
Java 8 Puzzlers [as presented at OSCON 2016]
Java 8 Puzzlers [as presented at  OSCON 2016]Java 8 Puzzlers [as presented at  OSCON 2016]
Java 8 Puzzlers [as presented at OSCON 2016]
 
JEEConf 2016. Effectiveness and code optimization in Java applications
JEEConf 2016. Effectiveness and code optimization in  Java applicationsJEEConf 2016. Effectiveness and code optimization in  Java applications
JEEConf 2016. Effectiveness and code optimization in Java applications
 

Ähnlich wie Java 8 puzzlers

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклыSergey Nemchinsky
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverVitebsk DSC
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур it-people
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 

Ähnlich wie Java 8 puzzlers (20)

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Zagursky
ZagurskyZagursky
Zagursky
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java Driver
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 

Java 8 puzzlers

  • 5. Что выведет следующий код? A. молоко/хлеб/колбаса B. молоко/хлеб/колбаса/яйца, яйца ещё! C. молоко/хлеб/колбаса/ConcurrentModificationException D. ConcurrentModificationException List<String> list = new ArrayList<>(); list.add("молоко"); list.add("хлеб"); list.add("колбаса"); Stream<String> stream = list.stream(); list.add("яйца, яйца ещё!"); stream.forEach(System.out::println);
  • 6.
  • 7. Объяснение тут • Late binding же List<String> list = new ArrayList<>(); list.add("молоко"); list.add("хлеб"); list.add("колбаса"); Stream<String> stream = list.stream(); list.add("яйца, яйца ещё!"); stream.forEach(System.out::println);
  • 9. Что выведет следующий код? A. молоко/хлеб/колбаса B. молоко/хлеб/колбаса/яйца, яйца ещё! C. молоко/хлеб/колбаса/ConcurrentModificationException D. молоко/хлеб/яйца, яйца ещё! List<String> list = new ArrayList<String>(); list.add("молоко"); list.add("хлеб"); list.add("колбаса"); list = list.subList(0, 2); //не надо колбасу! Stream<String> stream = list.stream(); list.add("яйца, яйца ещё!"); stream.forEach(System.out::println);
  • 10.
  • 13. В чём разница между строчками 1 и 2? A. 1 компилируется, 2 нет B. 2 компилируется, 1 нет C. Что в лоб, что по лбу, обе нормально сработают. D. Без разницы, обе не компилируются. public void killAll(){ ExecutorService ex = Executors.newSingleThreadExecutor(); List<String> sentence = Arrays.asList("Казнить"); ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1 ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2 }
  • 15. В чём разница между строчками 1 и 2? A. 1 компилируется, 2 нет B. 2 компилируется, 1 нет C. Что в лоб, что по лбу, обе нормально сработают. D. Без разницы, обе не компилируются. public void killAll(){ ExecutorService ex = Executors.newSingleThreadExecutor(); List<String> sentence = Arrays.asList("Казнить"); ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1 ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2 }
  • 16. @FunctionalInterface public interface Runnable { public abstract void run(); } @FunctionalInterface public interface Callable<V> { V call() throws Exception; } public void killAll(){ ExecutorService ex = Executors.newSingleThreadExecutor(); List<String> sentence = Arrays.asList("Казнить"); ex.submit(() -> Files.write(Paths.get("Приговор.txt"), sentence) ); // 1 ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2 }
  • 18. Что будет? A. Ошибка компиляции B. Вылетит с исключением C. 3 D. Что−то другое System.out.println( Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get() );
  • 19.
  • 20. Что будет? A. −3 B. −1 C. 0 D. 1 D. Что−то другое: System.out.println( Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get() );
  • 21.
  • 22. • Math.max(−3, −2) = −2 < 0  −3 < −2, берём −2 • Math.max(−2, −1) = −1 < 0  −2 < −1, берём −1 • Math.max(−1, 0) = 0  −1 == 0, оставляем −1 • Math.max(−1, 1) = 1 > 0  −1 > 1, оставляем −1 • Math.max(−1, 2) = 2 > 0  −1 > 2, оставляем −1 • Math.max(−1, 3) = 3 > 0  −1 > 3, оставляем −1 Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
  • 24. Что произойдёт после выполнения? A. Мапы поменяются местами B. Обе станут олдскульными C. Обе станут как надо D. Поучитесь программировать! Это вообще не скомпилируется! Map<String, String> oldSchool = initOldSchool(); // oldSchool = {buildTool=maven, lang=java, IOC=jee} Map<String, String> proper = initКакНадо(); // proper = {buildTool=gradle, lang=groovy, IOC=spring} oldSchool.replaceAll(proper::put);
  • 25.
  • 26. void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) V put(K key, V value); Map interface oldSchool.replaceAll(proper::put);
  • 27.
  • 28.
  • 29. Одинаково ли сработают три способа? List<String> list = Arrays.asList("Вронский", "Поезд", "Анна"); Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder()); System.out.println(Collections.max(list, cmp)); System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get()); System.out.println(list.stream().max(cmp).get()); A. Все ответы будут одинаковые B. Будет два разных ответа C. Будет три разных ответа D. Будет четыре разных ответа
  • 30. А в чём тут был паззлер?
  • 31. А теперь? A. Все ответы будут одинаковые B. Будет два разных ответа C. Будет три разных ответа D. Будет четыре разных ответа List<String> list = Arrays.asList("Вронский", null, "Анна"); Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder()); System.out.println(Collections.max(list, cmp)); System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get()); System.out.println(list.stream().max(cmp).get());
  • 33. Объяснение тут • null • NoSuchElementException • NullPointerException List<String> list = Arrays.asList("Вронский", null, "Анна"); Comparator<String> cmp = Comparator.nullsLast(Comparator.naturalOrder()); System.out.println(Collections.max(list, cmp)); System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get()); System.out.println(list.stream().max(cmp).get());
  • 35. Как сделать тип, не объявляя его? interface Кот{ default void мяукать() {System.out.println("мяу");}} interface Пёс{ default void лаять() {System.out.println("гав");}} public static void main(String[] args) { class Котопёс implements Кот, Пёс {} test(new Котопёс()); } static void test(Object obj) { def x = (?)obj; x.мяукать(); x.лаять(); }
  • 36. interface Кот{ default void мяукать() {System.out.println("мяу");}} interface Пёс{ default void лаять() {System.out.println("гав");}} public static void main(String[] args) { class Котопёс implements Кот, Пёс {} test(new Котопёс()); } Какой вариант сработает? static void test(Object obj) { // A. Это сработает? Кот & Пёс x = (Кот & Пёс) obj; x.мяукать(); x.лаять(); } static void test(Object obj) { // B. Это сработает? ((Consumer<? extends Кот & Пёс>)(x -> { x.мяукать(); x.лаять(); })).accept((Кот & Пёс)obj); } static void test(Object obj) { // C. Это сработает? Optional.of((Кот & Пёс) obj) .ifPresent(x -> { x.мяукать(); x.лаять(); });} // D. Да вы упоролись, в моей Джаве такого не бывает!
  • 37.
  • 38. А как это вообще работает???
  • 39. static void test(Object obj) { Optional.of((Кот & Пёс) obj) .ifPresent(x -> { x.мяукать(); x.лаять(); });}
  • 40.
  • 42. Кто быстрее? IntStream.range(0, 100_000_000) .skip(99_000_000) .sum(); IntStream.range(0, 100_000_000) .parallel() .skip(99_000_000) .sum(); A. Параллельный быстрее конечно, причем сильно B. Параллельный медленнее C. По фигу, одинаково будет D. Exception
  • 43.
  • 44. parallel().skip() • API Note: While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order.
  • 45. parallel().skip() • API Note: While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order.
  • 46. parallel().skip() • API Note: While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order.
  • 47. parallel().skip() • API Note: While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order.
  • 50.
  • 51.
  • 52. IntStream.range(0, 100_000_000) .skip(1) .toArray(); Где больше вероятность на OutOfMemory? IntStream.range(0, 100_000_000) .toArray(); A. 1 B. 2 C. Одинаково D. Будет другой Exception 1) 2)
  • 53.
  • 54. IntStream.range(0, 100_000_000) .skip(1) .toArray(); Где больше вероятность на OutOfMemory? IntStream.range(0, 100_000_000) .toArray(); A. 1 B. 2 C. Одинаково D. Будет другой Exception 1) 2)
  • 56. Что выведет? A. ПРИВЕТ/ПРИВЕТ B. ПРИВЕТ/HELLO C. HELLO/ПРИВЕТ D. HELLO/HELLO public class Test { String str; void run() { str = "привет"; Supplier<String> s1 = str::toUpperCase; Supplier<String> s2 = () -> str.toUpperCase(); str = "hello"; System.out.println(s1.get()); System.out.println(s2.get()); } }
  • 57.
  • 58. public class Test { String str; void run() { str = "привет"; Supplier<String> s1 = str::toUpperCase; Supplier<String> s2 = () -> str.toUpperCase(); str = "hello"; System.out.println(s1.get()); System.out.println(s2.get()); } }
  • 59.
  • 60. Что произойдёт? A. ConcurrentModificationException B. ArrayIndexOutOfBoundsException C. NullPointerException D. Успешно завершится List<String> list = new ArrayList<>(Arrays.asList("Arne", "Chuck", "Slay")); list.stream().forEach(x -> { if(x.equals("Chuck")) { list.remove(x); } });
  • 61.
  • 62. Объяснение тут • stream().forEach()  spliterator().forEachRemaining() • forEachRemaining проверяет modcount один раз в конце • Удаление элемента приведёт к сдвигу массива с добавлением null в конце: [“Arne”, “Chuck”, “Slay”]  [“Arne”, “Slay”, null] • На последней итерации if(null.equals(“Chuck”)) упадёт с NPE (до CME не дожили) • Используйте list.removeIf(“Chuck”::equals);
  • 64. 1. Пишите читабельный код 2. Комментируйте все трюки 3. Иногда это баг 4. Пользуйтесь Интелиджей 5. Читайте документацию
  • 65. Главный вывод А Груви не так уж плох…
  • 66. Понравилось? Хвалите нас в твиттере! #JAVA8PUZZLERS - Не понравилось? / dev / null
  • 68. Спасибо за призы XP Injection infopulse