“Modern Java Recipes”
Speaker: Ken Kousen
For more blog posts from JavaOne, see the table of contents
All examples in this talk are in:
https://github.com/kousen/java_8_recipes
Lazy Streams
- Streams – doesn’t store elements, doesn’t modify source, lazy when possible, destructive (can only run once)
- Showed how findFirst() doesn’t cause all intermediate operations to run against all data in stream
- findFirst() is a short circuiting terminal operation
- Not many short circuiting stream operations. limit() is one as well for intermediate operation
Debugging streams
- Eclipse and IntelliJ let you put breakpoints in stream
- IntelliJ has plugin to see values in stream as go by
- peek() method
- Tip: Use a debug log library with peek so easy to turn off
Strings as Streams
- String does not implement Iterable
- Arrays.stream() doesn’t work for char[]
- str.codePoints() returns int stream
- StringBilder::appendCodePoint gets it back into stringish form
- Obscure case; source: stack overflow
allMatch, anyMatch, noneMatch
- all short circuiting terminal operations
- showed with prime number checker – noneMatch returns as soon as finds example that proves number isn’t prime
- also showed the assertFalse and anyMatch. I didn’t understand why this wasn’t assertTrue and noneMatch in the book
collect
- showed three arg version – Supplier, BiConsumer to add single element to the result and anoher BiConsumer ot combine two interim results
- the combiner isn’t mentioned in the JavaDoc pseudocoe
- the combiner also gets used for parallel streams
- reduce() is similar
Reduction
- count() == mapToLong(e -> 1L).sum()
- Added a few methods like Integer.sum(a,b) so can use as a BinaryOperator
- The two argument version of reduce takes an identity for the binary operator. This lets it return a value instead of an Optional
- Use reduce that takes BiFunction if reducing into a different type
Transforming streams
- map – one to one mapping
- flatMap – function from T to a stream. It is one to many where many is a stream
- Optional also has a flatMap() which is for flattening Optional<Optional<T>> to Optional<T>
Deferred execution
- Showed logger and how doesn’t build complex string if not needed to log
- Overload methods to take supplier for this case. Caller just needs to add () ->
- Don’t worry about this if you string is just a constant
- Optional.orElseGet works the same way
Partioning and Grouping
- downstream collectors – use when don’t want list back
Words
- showed the /user/share/dict/words example
- need to use try with resources when use Files.lines
- Comparator.comparingInt(..).reversed().thenComparing(..)
Finally, showed demo of Anartica time zone map. The South pole follows New Zealand time. Which eans has daylight savings time despite getting 6 months of light vs 6 mnonths of dark
My take: Everything in this talk is from the book which I’ve already heard. But I’ve never seen Ken speak and wanted to. And it’s fun seeing things presented out loud. His umor while writing and out loud are similar which is good. I learned a few things in the comments like the IntelliJ debugging plugin.