Slide 1

Slide 1 text

JDK 8 Functional Programming …For Groovy Developers

Slide 2

Slide 2 text

John Engelman • @johnrengelman • github.com/johnrengelman • ratpack.io • objectpartners.com/category/blog

Slide 3

Slide 3 text

Caveats • Scala • Clojure • Erlang • Haskell

Slide 4

Slide 4 text

…Big pile of Salt

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Questions?

Slide 7

Slide 7 text

public static TransformablePublisher stream(Publisher publisher) { return Streams.transformable(subscriber -> require().streamSubscribe((handle) -> publisher.subscribe(new Subscriber() { @Override public void onSubscribe(final Subscription subscription) { handle.event(() -> subscriber.onSubscribe(subscription) ); } @Override public void onNext(final T element) { handle.event(() -> subscriber.onNext(element)); } @Override public void onComplete() { handle.complete(subscriber::onComplete); } @Override public void onError(final Throwable cause) { handle.complete(() -> subscriber.onError(cause)); } }) )); }

Slide 8

Slide 8 text

java.util.function https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

Slide 9

Slide 9 text

JDK8 Functional Interfaces Conceptually, a functional interface has exactly one abstract method. - https://docs.oracle.com/javase/8/docs/api/java/ lang/FunctionalInterface.html

Slide 10

Slide 10 text

public interface Supplier { T get(); }

Slide 11

Slide 11 text

Supplier supply() { return (() -> { return new Foo(); }); } lambda expression parameters list body

Slide 12

Slide 12 text

Supplier supply() { return (() -> new Foo()); } implicit return where have we seen that before?

Slide 13

Slide 13 text

Supplier supply() { return Foo::new } method handle

Slide 14

Slide 14 text

Supplier supply() { return { new Foo() } } Supplier supply() { //http://mrhaki.blogspot.com/2015/03/groovy-goodness- use-constructor-as.htm Foo.metaClass.&invokeConstructor }

Slide 15

Slide 15 text

public interface Consumer { void accept(T t); }

Slide 16

Slide 16 text

Consumer consume() { return (val -> System.out.println(val)); } Consumer consumeMethod() { return System.out::println; }

Slide 17

Slide 17 text

Consumer consume() { return { val -> println val.name } } Consumer consumeMethod() { this.&println }

Slide 18

Slide 18 text

public interface Function { R appy(T t); }

Slide 19

Slide 19 text

Function convert() { return (foo -> { return new Bar(foo.name); }); } Function convertMethod() { return Bar::new; }

Slide 20

Slide 20 text

Function convert() { return { foo -> new Bar(foo.name) } } Function convertMethod() { Bar.metaClass.&invokeConstructor }

Slide 21

Slide 21 text

public interface BiConsumer { void accept(T t, U u); } public interface BiFunction { R apply(T t, U u); }

Slide 22

Slide 22 text

Where is TriFunction?

Slide 23

Slide 23 text

• BiConsumer • BiFunction • BinaryOperator • BiPredicate • BooleanSupplier • Consumer • DoubleBinaryOperator • DoubleConsumer • DoubleFunction • DoublePredicate • DoubleSupplier • DoubleToIntFunction • DoubleToLongFunction • DoubleUnaryOperator • Function • IntBinaryOperator • IntConsumer • IntFunction • IntPredicate • IntSupplier • IntToDoubleFunction • IntToLongFunction • IntUnaryOperator • LongBinaryOperator • LongConsumer • LongFunction • LongPredicate • LongSupplier • LongToDoubleFunction • LongToIntFunction • LongUnaryOperator • ObjDoubleConsumer • ObjIntConsumer • ObjLongConsumer • Predicate • Supplier • ToDoubleBiFunction • ToDoubleFunction • ToIntBitFunction • ToIntFunction • ToLongBiFunction • ToLongFunction • UnaryOperator Java • Closure Groovy

Slide 24

Slide 24 text

java.util.stream https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

Slide 25

Slide 25 text

List filter(List foos) { return foos.stream() .filter(foo -> foo.name.equals(“bar") ).collect(Collectors.toList()); } List map(List foos) { return foos.stream() .map(Bar::new).collect(Collectors.toList()); } List distinct(List foos) { return foos.stream().distinct().collect(Collectors.toList()); }

Slide 26

Slide 26 text

List filter(List foos) { foos.findAll { foo -> foo.name == 'bar' } } List map(List foos) { foos.collect { new Bar(foo) } } List distinct(List foos) { foos.unique() }

Slide 27

Slide 27 text

public static TransformablePublisher stream(Publisher publisher) { return Streams.transformable(subscriber -> require().streamSubscribe((handle) -> publisher.subscribe(new Subscriber() { @Override public void onSubscribe(final Subscription subscription) { handle.event(() -> subscriber.onSubscribe(subscription) ); } @Override public void onNext(final T element) { handle.event(() -> subscriber.onNext(element)); } @Override public void onComplete() { handle.complete(subscriber::onComplete); } @Override public void onError(final Throwable cause) { handle.complete(() -> subscriber.onError(cause)); } }) )); }

Slide 28

Slide 28 text

public static TransformablePublisher stream(Publisher publisher) { return Streams.transformable { subscriber -> require().streamSubscribe { handle -> publisher.subscribe(new Subscriber() { @Override public void onSubscribe(final Subscription subscription) { handle.event { subscriber.onSubscribe(subscription) } } @Override public void onNext(final T element) { handle.event { subscriber.onNext(element) } } @Override public void onComplete() { handle.complete(subscriber.&onComplete) } @Override public void onError(final Throwable cause) { handle.complete { subscriber.onError(cause) } } }) } } }

Slide 29

Slide 29 text

Default Interface Methods • Game changer public interface Baz { String getName(); default Bar bar() { return new Bar(this); } } Bar interfaceMethod(Baz baz) { return baz.bar(); } Bar useInterface() { return interfaceMethod(() -> "John"); } becomes a Supplier lambda implicitly coerced to interface

Slide 30

Slide 30 text

Default Interface Methods • Not directly* supported in Groovy * Groovy 2.3 introduced Traits which are similar

Slide 31

Slide 31 text

References/More Info • https://github.com/danveloper/uberconf2014- from-groovy-to-java8/blob/master/from-groovy-to- java8.pdf • Anything w/ Venkat • https://www.youtube.com/watch? v=Ee5t_EGjv0A