lambda expressions in java
TRANSCRIPT
Lambda Expressions in JavaErhan Bagdemir
bagdemir.com - Follow on @ebagdemir
February 11, 2015
1 / 19
Today’s Agenda
I Definition of Lambda.I Lambda Expressions in Java.I Functional InterfacesI Method References :: OperatorI forEach()I Streams
2 / 19
Lambda Expressions: Definition of Lambda
I A formal system for expressingcomputational behaviour.I Invented by Alonzo Church in 1930.
I Lambda expressions consist of manyparentheses i.e in Y-Combinator:
Y = λf .(λx .f (xx))(λx .f (xx))
3 / 19
Lambda Expressions: The Idea, behind
I Functions are first-class citizens.I Lambda expressions are high orderfunctions:I They take other functions as a parameter.I They may return functions.
I The functions in Lambda all referentiallytransparent (pure functions). They:I provide a better parallelisation (no side-effects),I are easier to test,I are cacheable and provide lazy evaluation.
4 / 19
Lambda Expressions: Java 8
Some examples of function definitions:I in Javascript : function () { return x + 1 };I in LISP: (lambda (x) x + 1)I in C++11: [](int x) { return x + 1; }I in Scala: x => x + 1 or just _ + 1I in Java 8: (int x) -> x + 1
5 / 19
Lambda Expressions: Type of Lambda Expressions
Types of lambda expressions are defined in the java.util.function
Function<Integer, String> toStr = x -> Integer.parseValue(x);
You can pass lambdas as a parameter:
final Double forNetPrice = 50.0d;final Function<Double, Double> withVAT = x -> x * 1.19;prepareForShipment(withVAT, forPrice);
6 / 19
Lambda Expressions: Type of Lambda Expressions
If there is no functional interface in the java.util.function packagefor your usage, create your own:
@FunctionalInterfacepublic interface WorkflowLambda {
IAsset execute(String clientId, String userId, MetadataViewview);
}
WorkflowLambda workflow = (clientId, userId, view) ->executeWith(clientId, userId, view);
I Call Functional Interfaces or Single Abstract Method interfaces.
7 / 19
Lambda Expressions: Scope of Lambda ExpressionsThe scope of lambda expressions, the scope of the enclosing type:
@Servicepublic class OrderManagement {
@Injectprivate ShippingCostService scService;
private void calculateOrder() {/* final */ double vatRate = vatService.getVAT(Country.DE);Function<Double, Double> total = x -> (x * vatRate) +
this.scService.getCost();}
}
Local variables can be referenced by lambda expressions, as long asthey are effective final.
8 / 19
Lambda Expressions: Method References
We can use methods of existing classes as lambda expressions.Method references are syntactic shortcuts to the lambda expressions:
// static <T> void sort(T[] a, Comparator<? super T> c)
Collections.sort(myList, (firstInt, secondInt) -> firstInt -secondInt);
Collections.sort(myList, ExistingComparator::compare);
// if we’d an existing comparatorpublic class ExistingComparator {
public static Integer compare(Integer first, Integer second) {return first - second;
}}
9 / 19
Lambda Examples: forEach()
I Collections know how to iterate through their elements.I It’s a better style, which provides functional polymorphism, in
comparison to imperative external loops.
final List<Integer> myList = new ArrayList<>(3);myList.add(1);myList.add(5);myList.add(2);
myList.forEach(System.out::println);
A new method in the "Collection" interface without breaking code?
10 / 19
Lambda Examples: Default Implementations
Interfaces may have default implementations:
public interface Dog {
public void wagTail();
public default void bark() {System.out.println("Bark!");
}}
I The interfaces may contain static methods as well.
11 / 19
Lambda Examples: Streams
I Streams represent a sequence of elements, which support differentoperations that perform computations on these elements.
I There are two types of operations:I Intermediate Operations (filter, sort, etc.).I Terminal Operations (collect, forEach, reduce, etc.)
I Stream features:I No storage.I Functional in nature (No side-effects).I Streams are lazy (except sort).I Allowed to be unbounded.I Consumable.
I Streams are monads!
13 / 19
Lambda Examples: Stream Pipelines
The processing pipeline consists of a source, intermediate operationsand a terminal operation.
14 / 19
Lambda Examples: Streams
I Stream sources: Arrays, Collections, Generators and I/O Streams,e.g:
try (BufferedReader br = new BufferedReader(newInputStreamReader(is))) {
br.lines().forEach(System.out::println);}catch (Exception e) {
System.out.println(e.getMessage());}
I After a terminal operation, the stream is considered to beconsumed.
I Intermediate operations are lazy and always return a new stream.(see Example 6)
16 / 19
Lambda Examples: Code Samples
Some examples (https://github.com/bagdemir/java8-training) :I GeneratorsI ComparatorsI File I/OI Regular ExpressionsI ReducerI CollectorsI Parallel Streams
17 / 19
Lambda Examples: Finish
Functional Programming (in Scala) Structure and Interpretation ofComputer Programs
18 / 19