Map, filter and reduce Programming by composition
Mapping Apply operation to each element of a list, gathering the results in a new list. Example: – list: (“Your” “call” “is” “important” “to” “us”) – operation: string length – result: ( )
Conceptual diagram (specific case) (“Your” “call” “is” “important” “to” “us”) MAP String length ( )
Conceptual diagram (generalized) Input list MAP Unary Operation Output list
Conceptual diagram (generalized) Input list MAP Unary Operation Output list INVARIANT
VARIANTS Conceptual diagram (generalized) Input list MAP Unary Operation Output list
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Code (Map)
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Code (Map) Invariant parts
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Code (Map) Invariant parts
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Map operation to rest of list, getting answer recursively Code (Map) Invariant parts
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Apply operation to first item of list Code (Map) Invariant parts
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Insert result into new list Code (Map) Invariant parts
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } Code (Map) Variant parts VARIANT: the input list
public class Map implements IAlgo,Domain,LRStruct > { public LRStruct emptyCase(LRStruct host, IUnaryOperation arg) { return new LRStruct (); } public LRStruct nonEmptyCase(LRStruct host, IUnaryOperation arg) { return host.getRest().execute(this,arg).insertFront(arg.apply(host.getDatum())); } VARIANT: the operation Code (Map) Variant parts VARIANT: the operation
The IUnaryOperation interface public interface IUnaryOperation { public Range apply(Domain arg); }
Mapping: Domain Range f: x f(x) DOMAIN RANGE x f(x)
A concrete operation public class StringLen implements IUnaryOperation { public Integer apply(String arg) { return arg.length(); } DOMAI N RANGE
A concrete operation public class Times2 implements IUnaryOperation { public Integer apply(Integer arg) { return 2*arg; } public String toString() { return "x -> 2*x"; } DOMAI N RANGE
Reduction Combine all values of a list using (op,id) a binary operation op, with identity element id. Example: – list: ( ) – operation (+,0) – result: 23
The IBinaryOperation interface public interface IBinaryOperation { public Range apply(Domain1 arg1, Domain2 arg2); public Range identityElement(); }
Filtering Apply a predicate to each element of a list, building a new list of those elements for which the predicate is true. Example: – list: (“Your” “call” “is” “important” “to” “us”) – predicate: contains exactly one vowel – result: (“call” “is” “to” “us”)
The IPredicate interface public interface IBinaryOperation { public Range apply(Domain1 arg1, Domain2 arg2); public Range identityElement(); }