SlideShare a Scribd company logo
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);
Java 8 puzzlers
Объяснение тут
• 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);
Java 8 puzzlers
• Баг!!!
Сага о палаче
В чём разница между строчками 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()
);
Java 8 puzzlers
Что будет?
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()
);
Java 8 puzzlers
• 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);
Java 8 puzzlers
void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
V put(K key, V value);
Map interface
oldSchool.replaceAll(proper::put);
Java 8 puzzlers
Java 8 puzzlers
Одинаково ли сработают три способа?
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. Да вы упоролись, в моей Джаве такого не бывает!
Java 8 puzzlers
А как это вообще работает???
static void test(Object obj) {
Optional.of((Кот & Пёс) obj)
.ifPresent(x -> {
x.мяукать();
x.лаять();
});}
Java 8 puzzlers
Кто быстрее?
Кто быстрее?
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
Java 8 puzzlers
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()
Java 8 puzzlers
Java 8 puzzlers
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)
Java 8 puzzlers
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());
}
}
Java 8 puzzlers
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());
}
}
Java 8 puzzlers
Что произойдёт?
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);
}
});
Java 8 puzzlers
Объяснение тут
• 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

More Related Content

What's hot (20)

PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
PDF
JPoint 2016 - Etudes of DIY Java profiler
Anton Arhipov
 
PDF
Spring puzzlers
Evgeny Borisov
 
PDF
Something about Golang
Anton Arhipov
 
PDF
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
PPTX
Мифы и легенды Java Stream API
CEE-SEC(R)
 
PPTX
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
PDF
Thread
Alexander Rusin
 
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
PPTX
Async clinic by by Sergey Teplyakov
Alex Tumanoff
 
PPTX
Kotlin with API tests
Roman Marinsky
 
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
PDF
Clojure #1
Alexander Podkhalyuzin
 
PDF
Асинхронный JavaScript
Александр Рудевич
 
PDF
Clojure #2 (2014)
Alexander Podkhalyuzin
 
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
PDF
Оптимизация производительности Python
PyNSK
 
PPTX
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
PPT
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
 
PDF
RDSDataSource: Promises
RAMBLER&Co
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
JPoint 2016 - Etudes of DIY Java profiler
Anton Arhipov
 
Spring puzzlers
Evgeny Borisov
 
Something about Golang
Anton Arhipov
 
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Мифы и легенды Java Stream API
CEE-SEC(R)
 
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Async clinic by by Sergey Teplyakov
Alex Tumanoff
 
Kotlin with API tests
Roman Marinsky
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Асинхронный JavaScript
Александр Рудевич
 
Clojure #2 (2014)
Alexander Podkhalyuzin
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
Оптимизация производительности Python
PyNSK
 
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
 
RDSDataSource: Promises
RAMBLER&Co
 

Viewers also liked (9)

PPTX
Spring the ripper
Evgeny Borisov
 
PDF
Let if flow: Java 8 Streams puzzles and more
Bhakti Mehta
 
PDF
Spring data jee conf
Evgeny Borisov
 
PDF
How Immutability Helps in OOP
Yegor Bugayenko
 
PPTX
Spock
Evgeny Borisov
 
PDF
мифы о спарке
Evgeny Borisov
 
PPTX
Javaeeconf 2016 how to cook apache kafka with camel and spring boot
Ivan Vasyliev
 
PPTX
Java 8 Puzzlers [as presented at OSCON 2016]
Baruch Sadogursky
 
PPTX
JEEConf 2016. Effectiveness and code optimization in Java applications
Strannik_2013
 
Spring the ripper
Evgeny Borisov
 
Let if flow: Java 8 Streams puzzles and more
Bhakti Mehta
 
Spring data jee conf
Evgeny Borisov
 
How Immutability Helps in OOP
Yegor Bugayenko
 
мифы о спарке
Evgeny Borisov
 
Javaeeconf 2016 how to cook apache kafka with camel and spring boot
Ivan Vasyliev
 
Java 8 Puzzlers [as presented at OSCON 2016]
Baruch Sadogursky
 
JEEConf 2016. Effectiveness and code optimization in Java applications
Strannik_2013
 
Ad

Similar to Java 8 puzzlers (20)

PDF
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
JavaDayUA
 
PPTX
Android - 03 - Multithreading, Collections
Noveo
 
PPTX
Collections
DmitryTrushkin
 
PDF
О.В.Сухорослов "Многопотчное программирование. Часть 2"
Yandex
 
PDF
Discovering Lambdas in Java 8
Stfalcon Meetups
 
PDF
Java осень 2013 лекция 2
Technopark
 
PPTX
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
PPTX
Зачем нужна Scala?
Vasil Remeniuk
 
PDF
Lambdas in java 8
chashnikov
 
PPTX
основы Java переменные, циклы
Sergey Nemchinsky
 
PDF
Иван Иноземцев — Fantom
Yury Yurevich
 
PDF
Java 9: what is there beyond modularization
Ivan Krylov
 
PDF
Groovy jug-moscow-part 1
Evgeny Borisov
 
PDF
Lec 4
Alexander Rusin
 
PDF
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ScalaNsk
 
PDF
Scala: что, как и зачем?
Roman Timushev
 
PPTX
Java Core. Lecture# 4. Collections.
Anton Moiseenko
 
PDF
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 
PDF
Kotlin - следующий язык после Java
Kirill Rozov
 
PDF
Kotlin на практике
Виталий Бендик
 
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
JavaDayUA
 
Android - 03 - Multithreading, Collections
Noveo
 
Collections
DmitryTrushkin
 
О.В.Сухорослов "Многопотчное программирование. Часть 2"
Yandex
 
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Java осень 2013 лекция 2
Technopark
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
Зачем нужна Scala?
Vasil Remeniuk
 
Lambdas in java 8
chashnikov
 
основы Java переменные, циклы
Sergey Nemchinsky
 
Иван Иноземцев — Fantom
Yury Yurevich
 
Java 9: what is there beyond modularization
Ivan Krylov
 
Groovy jug-moscow-part 1
Evgeny Borisov
 
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ScalaNsk
 
Scala: что, как и зачем?
Roman Timushev
 
Java Core. Lecture# 4. Collections.
Anton Moiseenko
 
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 
Kotlin - следующий язык после Java
Kirill Rozov
 
Kotlin на практике
Виталий Бендик
 
Ad

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);
  • 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);
  • 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() );
  • 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() );
  • 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);
  • 26. void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) V put(K key, V value); Map interface oldSchool.replaceAll(proper::put);
  • 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. Да вы упоролись, в моей Джаве такого не бывает!
  • 38. А как это вообще работает???
  • 39. static void test(Object obj) { Optional.of((Кот & Пёс) obj) .ifPresent(x -> { x.мяукать(); x.лаять(); });}
  • 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
  • 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.
  • 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)
  • 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()); } }
  • 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()); } }
  • 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); } });
  • 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