Java 8 Puzzlers as it was presented at Codemash 2017
-
Upload
baruch-sadogursky -
Category
Technology
-
view
357 -
download
0
Transcript of Java 8 Puzzlers as it was presented at Codemash 2017
1. Two entertaining guys on stage
2. Funny Puzzling questions3. You think and vote4. Official twitter handles:
JAVApuzzlersngcodemash
5. Jfrog.com/shownotes
Watching the puzzlers like… #dafaq
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
Everything works (or doesn't) in the latest Java 8 update
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
What will be the output?
A. milk/bread/sausageB. milk/bread/sausage/eggs, don’t forget eggs!C. milk/bread/sausage/ConcurrentModificationExceptionD. ConcurrentModificationException
List<String> list = new ArrayList<>();list.add("milk");list.add("bread");list.add("sausage");Stream<String> stream = list.stream();list.add("eggs, don’t forget eggs!");stream.forEach(System.out::println);
Late binding, duh…
List<String> list = new ArrayList<>();list.add("milk");list.add("bread");list.add("sausage");Stream<String> stream = list.stream();list.add("eggs, don’t forget eggs!");stream.forEach(System.out::println);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
Late binding, duh…
List<String> list = new ArrayList<>();list.add("milk");list.add("bread");list.add("sausage");Stream<String> stream = list.stream();list.add("eggs, don’t forget eggs!");stream.forEach(System.out::println);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
What will be the output?
A. milk/bread/sausageB. milk/bread/eggs, don’t forget eggs!C. milk/bread/ConcurrentModificationExceptionD. ConcurrentModificationException
List<String> list = new ArrayList<>();list.add("milk");list.add("bread");list.add("sausage");list = list.subList(0, 2); //No sausage, please!Stream<String> stream = list.stream();list.add("eggs, don’t forget eggs!");stream.forEach(System.out::println);
What’s the difference between 1 and 2?
A. 1 compiles, 2 does notB. 2 compiles, 1 does notC. Same same, both work fineD. Same same, both won’t compile
public void killAll(){ExecutorService ex = Executors.newSingleThreadExecutor();List<String> sentence = Arrays.asList("Punish");ex.submit(() -> Files.write(Paths.get("Sentence.txt"), sentence) ); // 1ex.submit(() -> { Files.write(Paths.get("Sentence.txt"), sentence); }); // 2
}
What’s the difference between 1 and 2?
A. 1 compiles, 2 does notB. 2 compiles, 1 does notC. Same same, both work fineD. Same same, both won’t compile
public void killAll(){ExecutorService ex = Executors.newSingleThreadExecutor();List<String> sentence = Arrays.asList("Punish");ex.submit(() -> Files.write(Paths.get("Sentence.txt"), sentence) ); // 1ex.submit(() -> { Files.write(Paths.get("Sentence.txt"), sentence); }); // 2
}
public void killAll(){ExecutorService ex = Executors.newSingleThreadExecutor();List<String> sentence = Arrays.asList("Punish");ex.submit(() -> Files.write(Paths.get("Sentence.txt"), sentence) ); // 1ex.submit(() -> { Files.write(Paths.get("Sentence.txt"), sentence); }); // 2
}
@FunctionalInterfacepublic interface Runnable {
public abstract void run();}
@FunctionalInterfacepublic interface Callable<V> {
V call() throws Exception;}
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How that will work?
A. Compilation errorB. Runtime ExceptionC. 3D. Something else
System.out.println(Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How about now?
A. −3B. −1C. 0D. Something else
System.out.println(Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How about now?
A. −3B. −1C. 0D. Something else
System.out.println(Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
• Math.max(−3, −2) = −2 < 0 à −3 < −2, selecting−2• Math.max(−2, −1) = −1 < 0 à −2 < −1, selecting−1• Math.max(−1, 0) = 0 à −1 == 0, keeping−1• Math.max(−1, 1) = 1 > 0 à −1 > 1, keeping−1• Math.max(−1, 2) = 2 > 0 à −1 > 2, keeping−1• Math.max(−1, 3) = 3 > 0 à −1 > 3, keeping−1
Stream.of(-3, -2, -1, 0, 1, 2, 3).max(Math::max).get()
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
What will happen?
A. Maps will switchB. Both will become oldSchoolC. Both will become hipsterD. Really?! That won’t even compile!
Map<String, String> oldSchool = initOldSchoolStack();// oldSchool = {buildTool=maven, lang=java, db=db2}
Map<String, String> proper = initHipsterStack();// proper = {buildTool=npm, lang=javascript, db=elastic}
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);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
V put(K key, V value);
Map interface
final BiFunction<String, String, String> function = (key, value) -> proper.put(key, value);
for (Map.Entry<String, String> entry : oldSchool.entrySet())entry.setValue(function.apply(entry.getKey(), entry.getValue()));
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
V put(K key, V value);
Map interface
final BiFunction<String, String, String> function = (key, value) -> proper.put(key, value);
for (Map.Entry<String, String> entry : oldSchool.entrySet())entry.setValue(function.apply(entry.getKey(), entry.getValue()));
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How many lines will be the same?
List<String> kitties = Arrays.asList("Soft", "Warm", "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(kitties, kittiesComparator));System.out.println(kitties.stream().collect(Collectors.maxBy(kittiesComparator)).get());System.out.println(kitties.stream().max(kittiesComparator).get());
A. All lines the sameB. Two lines the sameC. All differentD. Four different
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How about now?
List<String> kitties = Arrays.asList("Soft", null, "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(kitties, kittiesComparator));System.out.println(kitties.stream().collect(Collectors.maxBy(kittiesComparator)).get());System.out.println(kitties.stream().max(kittiesComparator).get());
A. All lines the sameB. Two lines the sameC. All differentD. Four different
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How about now?
List<String> kitties = Arrays.asList("Soft", null, "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(kitties, kittiesComparator));System.out.println(kitties.stream().collect(Collectors.maxBy(kittiesComparator)).get());System.out.println(kitties.stream().max(kittiesComparator).get());
A. All lines the sameB. Two lines the sameC. All differentD. Four different
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
List<String> kitties = Arrays.asList("Soft", null, "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(Collections.max(kitties, kittiesComparator));
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
List<String> kitties = Arrays.asList("Soft", null, "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(kitties.stream().collect(Collectors.maxBy(kittiesComparator)).get());
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
List<String> kitties = Arrays.asList("Soft", null, "Purr");Comparator<String> kittiesComparator= Comparator.nullsLast(Comparator.naturalOrder());
System.out.println(kitties.stream().max(kittiesComparator).get());
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
nullCaught: java.lang.NoSuchElementExceptionCaught: java.lang.NullPointerException
Consistency, yeah.
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How to cast to a type without declaring it?
interface Cat{ default void meow() {System.out.println(”meow ");}}interface Dog{ default void bark() {System.out.println(”woof ");}}
public static void main(String[] args) {class Dogcatimplements Dog, Cat{}test(new Dogcat());
}
static void test(Object obj) {def x = (?)obj;x.meow ();x.bark ();
}
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How to cast to a type without declaring it?
static void test(Object obj) {// A. Will that work?
Dog& Catx = (Dog& Cat) obj;x.meow ();x.bark ();}
static void test(Object obj) {// B. Will that work?((Consumer<? extends Dog& Cat>)(x -> {x.meow ();x.bark ();
})).accept((Dog& Cat)obj); }
static void test(Object obj) {// C. Will that work?Optional.of((Dog& Cat) obj)
.ifPresent(x -> {x.meow ();x.bark ();
});}
// D. You’re two sick bastards.
interface Cat{ default void meow() {System.out.println(”meow");}}interface Dog{ default void bark() {System.out.println(”woof");}}
public static void main(String[] args) {class Dogcat implements Dog, Cat{}test(new Dogcat());
}
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
How to cast to a type without declaring it?
static void test(Object obj) {// A. Will that work?
Dog & Cat x = (Dog & Cat) obj;x.meow();x.bark();}
static void test(Object obj) {// B. Will that work?((Consumer<? extends Dog & Cat>)(x -> {x.meow();x.bark();
})).accept((Dog & Cat)obj); }
static void test(Object obj) {// C. Will that work?Optional.of((Dog & Cat) obj)
.ifPresent(x -> {x.meow();x.bark();
});}
// D. You’re two sick bastards.
interface Cat{ default void meow() {System.out.println(”meow");}}interface Dog{ default void bark() {System.out.println(”woof");}}
public static void main(String[] args) {static class Dogcat implements Dog, Cat{}test(new Dogcat());
}
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
Bill Gates explains how that works
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
static void test(Object obj) {// C. Will that work?Optional.of((Dog & Cat) obj)
.ifPresent(x -> {x.meow();x.bark();
});} @jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
Viktor Gamov and Baruch Sadogursky call customer service:
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
What will be the output?
1. HOTEL ECHO LIMA LIMA OSCAR/ HOTEL ECHO LIMA LIMA OSCAR2. HELLO / HOTEL ECHO LIMA LIMA OSCAR3. HOTEL ECHO LIMA LIMA OSCAR/ HELLO4. HELLO/HELLO
public class Test {String str;
void run() {str = "hello ";Supplier<String> s1 = str::toUpperCase;Supplier<String> s2 = () -> str.toUpperCase();str = "Hotel Echo Lima Lima Oscar ";System.out.println(s1.get());System.out.println(s2.get());
}}
What will be the output?
1. HOTEL ECHO LIMA LIMA OSCAR/ HOTEL ECHO LIMA LIMA OSCAR 2. HELLO / HOTEL ECHO LIMA LIMA OSCAR3. HOTEL ECHO LIMA LIMA OSCAR/ HELLO4. HELLO/HELLO
public class Test {String str;
void run() {str = ”hello";Supplier<String> s1 = str::toUpperCase;Supplier<String> s2 = () -> str.toUpperCase();str = ”Hotel Echo Lima Lima Oscar";System.out.println(s1.get());System.out.println(s2.get());
}}
What will happen?
1. ConcurrentModificationException2. ArrayIndexOutOfBoundsException3. NullPointerException4. No exceptions, all good
List<String> list = new ArrayList<>(Arrays.asList("Arnie", "Chuck", "Slay"));list.stream().forEach(x -> {
if(x.equals("Chuck")) {list.remove(x);
}});
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
What will happen?
A. ConcurrentModificationExceptionB. ArrayIndexOutOfBoundsExceptionC. NullPointerExceptionD. No exceptions, all good
List<String> list = new ArrayList<>(Arrays.asList("Arnie", "Chuck", "Slay"));list.stream().forEach(x -> {
if(x.equals("Chuck")) {list.remove(x);
}});
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
Here’s why:
stream().forEach() à spliterator().forEachRemaining()
forEachRemaining checks for mod count once, in the end
Removing element adds null to the end of the array:["Arne", "Chuck", "Slay"] à ["Arne", "Slay", null]
On the last iteration if(null.equals("Chuck")) fails with NPE (didn’t get to CME)
Use list.removeIf("Chuck"::equals);
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
System.out.println(Optional.of("rtfm").orElseGet(null));System.out.println(Optional.empty().map(null).orElse("rtfm"));
What will be the output?
A. rtfm / rtfmB. rtfm / NullPointerExceptionC. NullPointerException / NullPointerExceptionD. NullPointerException / rtfm
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
System.out.println(Optional.of("rtfm").orElseGet(null));System.out.println(Optional.empty().map(null).orElse("rtfm"));
What will be the output?
A. rtfm /rtfmB. rtfm / NullPointerExceptionC. NullPointerException / NullPointerExceptionD. NullPointerException / rtfm
@jbaruch@gamussa #javapuzzlersng #codemash http://jfrog.com/shownotes
- Write readable code!- Comment all the tricks- Sometimes it’s a bug- Static code analysis FTW -intellij IDEA!- Rtfm- Don’t abuse lambdas and streams!
- Trust us, we have much more where those came from.
- Puzzlers? Gotchas? Fetal position inducing behavior?
- puzzlers jfrog.com