Given a problem, most of us have a decent idea of how to model the problem in an Object-Oriented world. We can use principles like SOLID, GRASP, "Keep It DRY, Shy, and Tell the Other Guy" and so on to guide our design. In my experience, if you apply these principles recursively, (esp. on certain problems) you will notice, that you start drifting towards functional style of programming. For example, your object evolve to have single functions and gradually you can make the classes immutable. This leads to pure function without side-effects. At that point, you can turn them into closures (a poor man's object.) Eventually this leads to higher-order functions, which can be used as first class-citizens. Further more, you can express your domain behavior in terms of generic functions like map and reduce, which can be chained or composed to really simplify your logic and make your design more communicative. At this stage, you can really feel the difference between a declarative vs. imperative style of programming. If time permits, we can also look at how to apply concepts like partial function application, currying, lazy evaluation and infinite data-structures to tackle complexity and design for scalability. If this sounds interesting, join us for a code-along session, where we'll take a problem and incrementally evolve the design from OO to more of a functional style. Key Take-ways: 1. Introduction to Functional thinking 2. Demystify some of the core Functional Programming concepts and jargons 3. Understand how to evolve to a Functional style and its advantages Agenda: * Object-Oriented Design Principles (SOLID, DRY) * Functional Concepts ** Single Abstract Method (SAM) ** Pure Functions ** Immutability ** High-Order Functions ** Lambda Expressions ** Lazy evaluation ** Functional Composition ** Declarative vs. Imperative programming style * Quick Demo - Java 8 Functional Features