62
Functional Programming in Java Prem Chandrasekaran & Jorge Lee ThoughtWorks Inc. Jan 29th 2014

Functional Programming in Java

Embed Size (px)

DESCRIPTION

Functional programming has started (re)gaining prominence in recent years, and with good reason too. Functional programs lend an elegant solution to the concurrency problem, result in more modular systems, are more concise and are easier to test. While modern languages like Scala and Clojure have embraced the functional style whole-heartedly, Java has lagged a bit behind in its treatment of functions as first-class citizens. With the advent of Java 8 and its support for lambdas, however, Java programmers can finally start reaping the power of functional programs as well. Even without Java 8, it is possible to adopt a functional style with the aid of excellent libraries such as Guava.

Citation preview

Page 1: Functional Programming in Java

Functional Programming in Java

Prem Chandrasekaran & Jorge Lee ThoughtWorks Inc.

Jan 29th 2014

Page 2: Functional Programming in Java

What is Functional Programming?

Page 3: Functional Programming in Java

An Inventory Management Example

Page 4: Functional Programming in Java

Product

Page 5: Functional Programming in Java

Item

Page 6: Functional Programming in Java

Warehouse

Page 7: Functional Programming in Java

Task 1 - Print names of all items in inventory

Page 8: Functional Programming in Java

In Java 6…

Page 9: Functional Programming in Java

Task 2 - Print names of all in-stock items of a

category

Page 10: Functional Programming in Java

Implementation

Page 11: Functional Programming in Java

Now We Have…

Page 12: Functional Programming in Java

Issues?• Too much duplication

• Not sustainable

• Too brittle

Page 13: Functional Programming in Java

Issues?

We need to externalize the search criteria

Page 14: Functional Programming in Java

Refactor #1

Page 15: Functional Programming in Java

Refactor #1

Page 16: Functional Programming in Java

Refactor #1

Page 17: Functional Programming in Java

Refactor #1

Page 18: Functional Programming in Java

Refactor #2

Page 19: Functional Programming in Java

Recap…

Page 20: Functional Programming in Java

Now We Have…

Page 21: Functional Programming in Java

Task 3 - Search for Products by name

Page 22: Functional Programming in Java

Create Interface?

Page 23: Functional Programming in Java

Now We Have…

Page 24: Functional Programming in Java

Can we Refactor?

Page 25: Functional Programming in Java

And Now…

Page 26: Functional Programming in Java

Still Too Verbose?

Page 27: Functional Programming in Java

IDE Magic!

Page 28: Functional Programming in Java

That’s It! For Java 6

Page 29: Functional Programming in Java

Enter Java 8

Page 30: Functional Programming in Java

We Have…

Page 31: Functional Programming in Java

Refactor #3 - Lambdas

Page 32: Functional Programming in Java

Refactor #4 - No Types Necessary

Page 33: Functional Programming in Java

Refactor #5 - Method References

Page 34: Functional Programming in Java

Java 8 Gyaan• Functional Interface

• Interface with a single method without an implementation

• Can be enforced using the @FunctionalInterface annotation

• There are several standard functional interfaces defined in the java.lang.function package

Page 35: Functional Programming in Java

So…

Page 36: Functional Programming in Java

Becomes…

Page 37: Functional Programming in Java

Standard Functional Interfaces

Page 38: Functional Programming in Java

Task 4 - Filter in-stock items and print the Item -

not just its name

Page 39: Functional Programming in Java

We Have…

Page 40: Functional Programming in Java

Becomes…

Page 41: Functional Programming in Java

We Can Also…

Page 42: Functional Programming in Java

Task 5 - Print the number of items in inventory

Page 43: Functional Programming in Java

In Java 6…

Page 44: Functional Programming in Java

What are we doing?

1. Providing an initial/default value

2. Accumulating a result

3. Combining the result

Page 45: Functional Programming in Java

In Functional Terms…

Page 46: Functional Programming in Java

Alternatively…

Page 47: Functional Programming in Java

Alternatively…

Page 48: Functional Programming in Java

Conveniently

Page 49: Functional Programming in Java

Task 6 - Print number of items in all our warehouses

Page 50: Functional Programming in Java

In Java 6…

Page 51: Functional Programming in Java

In Functional Terms..

Page 52: Functional Programming in Java

Also We Can…

Page 53: Functional Programming in Java

Task 7 - Print the item with the least amount across warehouses

Page 54: Functional Programming in Java

In Java 6

Page 55: Functional Programming in Java

In Functional Terms…

Page 56: Functional Programming in Java

Conveniently

Page 57: Functional Programming in Java

Even more Conveniently

Page 58: Functional Programming in Java

Even More Conveniently

Page 59: Functional Programming in Java

Why Functional?• A newer different way of thinking

• More modular

• Side-effect free programs

• Immutable programs

• Easier to write concurrent code

• Easier to test

Page 60: Functional Programming in Java

What to do in Java 6?• Look in the Guava or Apache Commons Lang3 library

• But…

“As of Java 7, functional programming in Java can only be approximated through awkward and verbose use of anonymous classes. This is expected to change in Java 8, but Guava is currently aimed at users of Java 5 and above.!

Excessive use of Guava's functional programming idioms can lead to verbose, confusing, unreadable, and inefficient code. These are by far the most easily (and most commonly) abused parts of Guava, and when you go to preposterous lengths to make your code "a one-liner," the Guava team weeps.”

— Guava Documentation

Page 61: Functional Programming in Java

What to do in Java 6• First — Stop Whining

• Prefer final variables

• Minimize the use of void methods

• Avoid use of mutable globals (statics)

• Avoid returning nulls

• Read Effective Java - And apply learnings!

Page 62: Functional Programming in Java

Thank You!