Functional Programming In Java

33 %
67 %
Information about Functional Programming In Java
Technology

Published on March 14, 2009

Author: asolntsev

Source: slideshare.net

Description

Seminar about using Functional Programming ideas in Java

Functional Programming in Java Java technology seminar SECR, 2007 Andrei Solntsev

Purpose S eminar gives an overview of Functional Programming methods and its applications in Java for coding Business Logic and its customization

Agenda FP overview Sandwich algorithm FP main features Code samples Business Logic with FP FP libraries for Java

FP overview

Sandwich algorithm

FP main features

Code samples

Business Logic with FP

FP libraries for Java

FP Overview Computation is executing statements to change the program state. Imperative programming Functional programming Computation is evaluation of expressions The focus is on what , not how Expressions are formed by using functions to combine basic values Program consists of a sequence of commands.

Sandwich algorithm Function createSandwich Take a bread Spread bread with butter Put cheese on the bread return result Imperative return put ( cheese, spread(butter, bread) ) Functional

Take a bread

Spread bread with butter

Put cheese on the bread

return result

Sandwich algorithm If we want to use sausage instead of cheese ? Let’s pass sausage/cheese as input parameter No problems!

Sandwich algorithm Take a lower Spread lower with middle Put upper on the middle return result Function createSandwich (lower, middle, upper) return put ( upper, spread(middle, lower) ) Function createSandwich (lower, middle, upper) No problems! bread butter sausage

Take a lower

Spread lower with middle

Put upper on the middle

return result

Sandwich algorithm If we want to put butter instead of spreading ? Imperative programming: Problem! Functional programming: not a problem

Sandwich algorithm Take a lower if mode = ‘put’ put middle on lower else spread middle on lower end if Put upper on the middle return result Procedure createSandwich (lower, middle, upper, mode) Imperative programming: Problem! bread butter sausage put Alternative: create 2 different functions  Code duplication

Take a lower

if mode = ‘put’ put middle on lower else spread middle on lower end if

Put upper on the middle

return result

Sandwich algorithm return put ( upper, action (middle, lower) ) Function createSandwich (lower, middle, upper, action ) Functional programming: not a problem bread butter sausage put Action is a function with 2 parameters spread put … createSandwich is a higher-order function which takes another function as a parameter

spread

put



FP main features What is Functional Programming? Closures and higher order functions Lazy evaluation Recursion as a mechanism for control flow Enforcement of referential transparency No side-effects FP Languages Lisp (AutoCad) Haskell, Scheme, Logo XSLT Where a traditional imperative program might use a loop to traverse a list, a functional style would often use a higher-order function, map, that takes as arguments a function and a list, applies the function to each element of the list, and returns a list of the results.

Closures and higher order functions

Lazy evaluation

Recursion as a mechanism for control flow

Enforcement of referential transparency

No side-effects

Lisp (AutoCad)

Haskell, Scheme, Logo

XSLT

Code Samples in Haskell a dd :: I n teger -> Integer -> Integer add  x y =  x + y functions inc :: Integer -> Integer inc = add 1 map :: (a->b) -> [a] -> [b] map  f  []       =  [] map  f (x:xs)    =  f x : map f xs zip  (x:xs) (y:ys)  = (x,y) : zip xs ys zip   xs     ys     = [] Uncurried function F unction can be returned as a value ! Higher-order function curried function

a dd :: I n teger -> Integer -> Integer

add  x y =  x + y

Code Samples in Haskell ones = 1 : ones Infinite data structures numsFrom n = n : numsFrom (n+1) squares = map (^2) (numsfrom 0) take 5 squares => [0,1,4,9,16]

ones = 1 : ones

Code Samples in Haskell Fibonacci sequence fib = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]

FP-Style code example in Java java.util.Properties Properties properties = new Properties(); properties.setProperty(“firstName&quot;, groom.getFirstName()); properties.setProperty(“lastName&quot;, groom.getLastName()); properties.setProperty(“salary&quot;, groom.getSalary()); return parameters; return Imperative Functional return new Properties() .setProperty(“firstName&quot;, groom.getFirstName()) .setProperty(“lastName&quot;, groom.getLastName()) .setProperty(“salary&quot;, groom.getSalary()); Pros Cons

Pros

Cons

FP-Style code example In Java StringBuffer StringBuffer sb = new StringBuffer(); sb.append(“a”); sb.append(“b”); sb.append(“c”); return sb.toString(); return new StringBuffer() .append(“a”); .append(“b”); .append(“c”) .toString(); Imperative Functional Pros Cons ?

Pros

Cons ?

FP: Pros and Cons Pros Reliable code Readable Reusable … Non-natural for human Non-natural for computer Performance Cons Example: Quick Sort algorithm

Reliable code

Readable

Reusable



Non-natural for human

Non-natural for computer

Performance

Code sample: Quicksort Quicksort in Haskell qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x]

Quicksort in Haskell

qsort [] = []

qsort (x:xs) = qsort elts_lt_x ++

[x] ++

qsort elts_greq_x

where

elts_lt_x = [y | y <- xs, y < x]

elts_greq_x = [y | y <- xs, y >= x]

Code sample: Quicksort qsort( a, lo, hi ) int a[], hi, lo; { int h, l, p, t; if (lo < hi) { l = lo; h = hi; p = a[hi]; do { while ((l < h) && (a[l] <= p)) l = l+1; while ((h > l) && (a[h] >= p)) h = h-1; if (l < h) { t = a[l]; a[l] = a[h]; a[h] = t; } } while (l < h); t = a[l]; a[l] = a[hi]; a[hi] = t; qsort( a, lo, l-1 ); qsort( a, l+1, hi ); } } Quicksort in C

qsort( a, lo, hi ) int a[], hi, lo;

{

int h, l, p, t;

if (lo < hi) {

l = lo; h = hi; p = a[hi];

do {

while ((l < h) && (a[l] <= p))

l = l+1;

while ((h > l) && (a[h] >= p))

h = h-1;

if (l < h) {

t = a[l]; a[l] = a[h]; a[h] = t;

}

} while (l < h);

t = a[l]; a[l] = a[hi]; a[hi] = t;

qsort( a, lo, l-1 );

qsort( a, l+1, hi );

}

}

FP: Pros and Cons Pros Reliable code Readable Reusable … Non-natural for human Non-natural for computer Performance Cons Example: Quick Sort algorithm In Java, FP suits for implementing Business Logic Programs are easier to design, write and maintain, but programmer has less control over the machine.

Reliable code

Readable

Reusable



Non-natural for human

Non-natural for computer

Performance

Business logic with FP GroomFilter List suitableGrooms = new ArrayList(); for (groom in allGrooms) { if ( minAge > -1 && groom.getAge() < minAge ) continue; if (maxAge > -1 && groom.getAge() > maxAge) continue; suitableGrooms .add(groom); } return suitableGrooms ; List filterGrooms(List allGrooms , int minAge, int maxAge) If age is -1 then Don’t check age

Business logic with FP GroomFilter List suitableGrooms = new ArrayList(); for (groom in allGrooms) { if ( groomChecker .accept(groom)) suitableGrooms.add(groom); } return suitableGrooms; List filterGrooms(List allGrooms, Filter groomChecker ) Pass function as parameter

Business logic with FP public interface Filter { /** * Method defines whether given object is accepted. * @param obj any Object * @return true iff object is accepted */ boolean accept (Object obj); }

Business logic with FP public interface Filter { boolean accept (Object obj); public static final Filter ACCEPT = new Filter() { public boolean accept(Object obj){ return true; } }; public static final Filter NOT_NULL = new Filter() { public boolean accept(Object obj){ return obj!=null; } }; public static final Filter NEGATE ..; public static final Filter IS_NULL = …; } Predefined values

Business logic with FP Client 1 List suitableGrooms grooms = GroomFilter.filterGrooms(…, new Filter() { public boolean accept(Object obj) { return ((Groom) obj).getAge() > 23; } } ); Client 2 List suitableGrooms = GroomFilter.filterGrooms(…, Filter.ACCEPT ); Closure – object representing a function Anonymous classes are often used as closures

25 th frame 25 th frame

Parameterized Closures StringFilter public class StringFilter implements Filter { public static startsWith (final String prefix ) { return new Filter { public boolean accept (Object o){ return ((String) o). startsWith (prefix); } }; } public static endsWith (final String postfix ) {…} public static contains (final String substring ) {…} public static matches (final String regexp ) {…} };

Composition of functions Composition of functions: AND public class AND implements Filter { public AND (Filter filter1, Filter filter2) { this.filter1 = filter1; this.filter2 = filter2; } public boolean accept (Object obj) { return filter1.accept (obj) && filter2.accept (obj); } };

FP Applications: Filters FilteredIterator public class FilteredIterator implements Iterator { public FilteredIterator ( Iterator iterator , Filter filter ); } CollectionsUtils static List collectList ( Iterator it ); static Set collectSet ( Iterator it ); static List filterList ( List original , Filter filter ); static Set filterSet ( Set originalSet , Filter filter );

FP Applications: Filters Given: a list of all grooms’ names. Goal: find all names with prefix “Mr.” List gentlemen = new LinkedList(); for (Iterator it = groomsNames .iterator(); it.hasNext(); ) { String name = (String) it.next(); if (name != null && name.startsWith(“Mr.”)) { gentlemen .add(name); } } return gentlemen ; Imperative

FP Applications: Filters Functional return CollectionsUtils . filterList( allGrooms, StringFilter.startsWith( “Mr.” ) ) ; Given: a list of all grooms’ names. Goal: find all names with prefix “Mr.”

FP Applications: Transformers Transformer public interface Transformer { Object transform ( Object sourceObject ); } ListTransformer public class ListTransformer { public List transform ( List sourceList , Transformer transformer ); }

FP Applications: Transformers Given: list of Grooms Goal: create list grooms’ names List groomsNames = new ArrayList(); for (Iterator it = allGrooms .iterator(); it.hasNext(); ) { Groom groom = (Groom) it.next(); groomsNames .add(groom.getName()); } return groomsNames ; Imperative

FP Applications: Transformers return ListTransformer. transform( allGrooms , new Transformer () { public Object transform(Object obj) { return ((Groom) obj).getName(); } } ) ; Functional Given: list of Grooms Goal: create list grooms’ names

Business Logic customization Example using Plexus container import org.codehaus.plexus.embed.Embedder; public List findSuitableGrooms(Client woman) { Filter clientGroomFilter = ( Filter ) embedder.lookup ( “ groomFilter” , woman.getName() ); return GroomFilter.filterGrooms( allGrooms, clientGroomFilter ); }

Business Logic customization META-INF/plexus/components.xml <component-set> <components> <component> <role> groomFilter </role> <role-hint> default </role-hint> <implementation> examples. Filter.ACCEPT </implementation> </component> <component> <role> groomFilter </role> <role-hint> Maril Strip </role-hint> <implementation> examples. filters.OlderThan25 </implementation> </component> <component> <role> groomFilter </role> <role-hint> Jenifer Lopez </role-hint> <implementation> examples. filters.SalaryBiggerThan10000 </implementation> </component> </components> </component-set>

Conclusion I hope this article has provided you with a good foundation for incorporating closures and higher order functions into your Java code, as well as giving you a glimpse of the beauty and effectiveness of functional programming.

I hope this article has provided you with a good foundation for incorporating closures and higher order functions into your Java code, as well as giving you a glimpse of the beauty and effectiveness of functional programming.

FP Libraries for Java Commons Functors : Function Objects for Java http://jakarta.apache.org/commons/sandbox/functor JGA: Generic Algorithms for Java http:// jga.sourceforge.net http://plexus.codehaus.org

Articles Functional programming in the Java language http ://www-128.ibm.com/developerworks/library-combined/j-fp.html Use recursion effectively in XSL http://www-128.ibm.com/developerworks/xml/library/x-xslrecur Why Functional Programming Matters http:// www.math.chalmers.se/~rjmh/Papers/whyfp.html Introduction to Haskell http:// www.haskell.org/tutorial/

Add a comment

Related presentations

Related pages

Functional Java

Functional Java is an open source library facilitating functional programming in Java. The library implements numerous basic and advanced programming ...
Read more

Functional Programming in Java - Stack Overflow

Is there a good library for functional programming in Java? I'm looking for stuff like Predicate and List.Find() (as a static method). Not complicated to ...
Read more

Functional Programming in Java (A-Team - SOA)

Functional Programming brings new and interesting paradigms to code development. Several of those languages (Scala, Clojure) run on top of a Java VM, but ...
Read more

Functional Programming in Java: Harnessing the Power Of ...

Functional Programming in Java: Harnessing the Power Of Java 8 Lambda Expressions eBook: Venkat Subramaniam: Amazon.de: Kindle-Shop
Read more

The Pragmatic Bookshelf | Functional Programming in Java

title: Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions, by: Venkat Subramaniam, isbn: 9781937785468, date: 2014-02-28
Read more

The Cafes » Why Functional Programming in Java is Dangerous

74 Responses to “Why Functional Programming in Java is Dangerous” Hugo Sereno Ferreira Says: January 20th, 2013 at 9:00 am. I think your first and last ...
Read more

Functional Programming in Java: Harnessing the Power of ...

Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions: Amazon.de: Venkat Subramaniam: Fremdsprachige Bücher
Read more

Functional programming: A step backward | JavaWorld

Functional programming languages will have a place in general application development when we can read their code at a glance.
Read more

Manning | Functional Programming in Java

Functional Programming in Java teaches Java developers how to incorporate the most powerful benefits of functional programming into new and existing Java code.
Read more

AngelikaLanger.com - Effective Java - Java 8 - Functional ...

Java 8 - Functional Programming in Java ... In funktionalen Sprachen (wie zum Beispiel Erlang, Haskell, ...) stehen nicht Objekte, sondern Funktionen im ...
Read more