java 8 puzzlers -...

54

Transcript of java 8 puzzlers -...

Page 1: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 2: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Краткое содержание

Page 3: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Любите нас в Твиттере!

#jpoint#java8puzzlers@tagir_valeev@jekaborisov@jbaruch@real_jbaruch (мы не знаем, кто это, но он ОК)

Page 4: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

История про забытые яйца

Page 5: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что выведет следующий код?

A. молоко/хлеб/колбасаB. молоко/хлеб/колбаса/яйца, яйца ещё!C. молоко/хлеб/колбаса/ConcurrentModificationExceptionD. ConcurrentModificationException

List<String> list = new ArrayList<>();list.add("молоко");list.add("хлеб");list.add("колбаса");Stream<String> stream = list.stream();list.add("яйца, яйца ещё!");stream.forEach(System.out::println);

Page 6: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 7: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

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

Page 8: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Kолбасы не надо

Page 9: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что выведет следующий код?

A. молоко/хлеб/колбасаB. молоко/хлеб/колбаса/яйца, яйца ещё!C. молоко/хлеб/колбаса/ConcurrentModificationExceptionD. молоко/хлеб/яйца, яйца ещё!

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

Page 10: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 11: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

• Баг!!!

Page 12: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Сага о палаче

Page 13: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

В чём разница между строчками 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) ); // 1ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2

}

Page 14: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Точкисзапятыми– зло!

Page 15: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

В чём разница между строчками 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) ); // 1ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2

}

Page 16: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

@FunctionalInterfacepublic interface Runnable {

public abstract void run();}

@FunctionalInterfacepublic 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) ); // 1ex.submit(() -> { Files.write(Paths.get("Приговор.txt"), sentence); }); // 2

}

Page 17: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Безумный Макс

Page 18: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что будет?

A. Ошибка компиляцииB. Вылетит с исключениемC. 3D. Что−то другое

System.out.println(Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()

);

Page 19: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 20: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что будет?

A. −3B. −1C. 0D. 1

D. Что−то другое:

System.out.println(Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()

);

Page 21: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 22: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

• 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()

Page 23: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Настало время апгрейда

Page 24: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что произойдёт после выполнения?

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

Page 25: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 26: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

V put(K key, V value);

Map interface

oldSchool.replaceAll(proper::put);

Page 27: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 28: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Одинаково ли сработают три способа?

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. Будет четыре разных ответа

Page 29: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

А пазлер в чём?

Page 30: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

А теперь?

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

Page 31: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Вот теперь убиться

Page 32: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Объяснение тут

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

Page 33: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Мутанты

Page 34: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Как сделать тип, не объявляя его?

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.лаять();

}

Page 35: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

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. Да вы упоролись, в моей Джаве такого не бывает!

Page 36: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 37: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

А как это вообще работает???

Page 38: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

static void test(Object obj) {// C. Это сработает?Optional.of((Кот & Пёс) obj)

.ifPresent(x -> {x.мяукать();x.лаять();

});}

Page 39: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 40: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Трудности перевода

Page 41: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что выведет?

A. ПРИВЕТ/ПРИВЕТB. ПРИВЕТ/HELLOC. 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());

}}

Page 42: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 43: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

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

}}

Page 44: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 45: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Что произойдёт?

A. ConcurrentModificationExceptionB. ArrayIndexOutOfBoundsExceptionC. NullPointerExceptionD. Успешно завершится

List<String> list = new ArrayList<>(Arrays.asList("Arne", "Chuck", "Slay"));list.stream().forEach(x -> {

if(x.equals("Chuck")) {list.remove(x);

}});

Page 46: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 47: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Java 8 vs Chuck Norris

Page 48: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Ад вот почему:

• stream().forEach() à spliterator().forEachRemaining()• forEachRemaining проверяет modcount один раз в конце• Удаление элемента приведёт к сдвигу массива с добавлением null в конце:

[“Arne”, “Chuck”, “Slay”] à [“Arne”, “Slay”, null]• На последней итерации if(null.equals(“Chuck”)) упадёт с NPE (до CME не дожили)

• Используйте list.removeIf(“Chuck”::equals);

Page 49: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,
Page 50: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Выводы

Page 51: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

1. Пишите читабельный код2. Комментируйте все трюки3. Иногда это баг4. Пользуйте static code analysis - intellij

IDEA!5. Rtfm6. Хм, а groovy не так уж и плох!

Page 52: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Паззлеров, конечно, полно.

Наткнулись на паззлер? Давайте его сюда!

Page 53: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,

Понравилось?Хвалите нас в твиттере скорее!

- java8puzzlers jpoint- Tagir valeev- jekaborisov- jbaruch

Не понравилось?/dev/null

Page 54: java 8 puzzlers - public.jugru.orgpublic.jugru.org/jpoint/2016/msk/day_2/track_1/java_8_puzzlers.pdfВ чём разница между строчками 1 и 2? A. 1 компилируется,