Sunday, November 9, 2014

Lambdas and Java 8

Java 1.8 introduces the concept of streams, which are similar to iterators.

Why Lambdas are good for you:

Form the basis of functional programming language

Make parallel programming easier

Write more compact code

Richer data structure collections

Develop cleaner APIs

Lambdas Expression Lifecycle - think of them as having a two stage lifecycle:

Convert the lambda expression to a function.

Call the general function

Streams have two types of operations: intermediate and terminal.Intermediate operation: specifies tasks to perform on the stream's elements and always results in a new stream.filter: Result in a stream containing only the elements that satisfy a condition.distinct: Result in a stream containing only the unique element.limit: Result in a stream with the specified number of elements from the beginning of the original stream.map: Result in a stream in which each element of the original stream is mapped to a new value (possibly of a different type).sorted: Result in a stream in which the elements are in sorted order. The new stream has the same number of elements as the original stream.

Terminal operations initiates processing of a stream pipeline's intermediate operations and produces results.forEach: Performs processing on every element in a stream.average: Calculates the average of the elements in a numeric stream.count: Returns the number of elements in the stream.max: Locates the largest value in a numeric stream.min: Locates the smallest value in a numeric stream.reduce: Reduces the element of a collection to a single value using an associative accumulation function (e.g. a lambda that adds two elements -- in Scala this is the "map" operator).

Mutable reduction operations: creates a container (such as a collection or StringBuilder)collect: Creates a new collection of elements containing the results of the streams's prior operations.toArray: Creates an array containing the results of the stream's prior operations.

Search operationsfindFirst: Find the first stream element based on the prior intermediate operations; immediately terminates the processing of the stream pipeline once such an element is found.findAny: Finds any stream element based on the prior intermediate operations: immediately processing of the stream pipeline once such an element is found.anyMatch: Determines whether any stream elements match a specified conditions; immediately terminates processing of the stream pipeline if an element matches.allMatch: Determines whether all of the elements in the stream match a specified condition.Examples:

Refactor:

This has done so many different changes to some of my code. Here are some example of before and after:
Before:
I wanted to printout some of the results and so I leveraged Spring's CommandLineRunner.

Here's the after code:
Another example fetching a collection of records from a database:
I can refactored it doing this: