• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Functional Programming In Java
 

Functional Programming In Java

on

  • 8,727 views

Seminar about using Functional Programming ideas in Java

Seminar about using Functional Programming ideas in Java

Statistics

Views

Total Views
8,727
Views on SlideShare
8,685
Embed Views
42

Actions

Likes
7
Downloads
268
Comments
0

5 Embeds 42

http://www.slideshare.net 31
http://www.linkedin.com 5
https://www.linkedin.com 3
http://localhost 2
http://www.brijj.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Functional Programming In Java Functional Programming In Java Presentation Transcript

    • 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 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
    • 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
    • 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
    • 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
    • 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.
    • 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
    • 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]
    • 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
    • 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 ?
    • FP: Pros and Cons Pros
      • Reliable code
      • Readable
      • Reusable
      • Non-natural for human
      • Non-natural for computer
      • Performance
      Cons Example: Quick Sort algorithm
    • 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]
    • 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
    • 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.
    • 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.
    • 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/