OCP Chapter 06
Chapter 06 Lambdas
- Alles tussen curly braces...
 - work with interface with only one abstract method. (functional interface)
 - SAM Single Abstract Method (SAM rule)
 
a -> a.canHop()
// zelfde als:
(Animal a) -> {return a.canHop();}
- single param
 - arrow operator to seperate param and body
 - one or more lines of code, incl semicolo and return statment.
 
Geen {} betekent dat ie returned. Gaat niet met 2 of meer return statements.
wel valide....
s->{}
()-> true
a-> a.startsWith("test")
(a,b)-> a.startsWith("test")
(String a, String b) ->a.startsWith("test")
NIET valide
a,b -> a.startsWith("test") // missende boogjes
a -> {a.startsWith("test");} // missende return...
a -> {return a.startsWith("test")} // missende semicolon ;
Functional Interfaces
- Predicate
 - Consumer
 - Supplier
 - Comparator
 
Predicate
public interface Predicate<T> {
    boolean test(T t);
}
Consumer
void accept(T t)
Supplier
T get()
//
Supplier<Integer> number = () -> 42;
Supplier<Integer> random = () -> newRandom().nextInt();
Comparator
int compate(T o1, T o2)
// ascending sort
Comparator<Integer> ints = (i1,i2) -> i1 -i2;
// descending
Comparator<String> strings = (s1,s2) -> s2.compareTo(s1);
Comparator<String> moreStrings = (s1,s2) -> - s1.compareTo(s2);
| Func interface | params | return type | 
|---|---|---|
| Comparator | Two | int | 
| Consumer | One | void | 
| Predicate | One | boolean | 
| Supplier | None | One | 
Variables in Lambas
Predicate<String> p = x -> true;
Predicate<String> p = (var x) -> true;
Predicate<String> p = (Stringx) -> true;
Local variable in Lambda body
(a,b) -> {init c = 0; return 5;}
(a,b) -> {init a = 0; return 5;} // DNC
Variable referenced from the labmda body
- can access instance variable, method params, or local variables
 - Method params and local variables are allowed if they are effectively final. (no change after set...)
 
| Variable type | Rule | 
|---|---|
| instance variable | allowed | 
| static variable | allowed | 
| local variable | allowed (if eff final) | 
| method variable | allowed (if eff final) | 
| lambda param | allowed | 
Calling APIs with Lambdas
RemoveIf()
NOT on a Map! Map heeft keys and values...
sort()
begint met twee vars en returns an int!!
Not a sort on a Set of Map
forEach()
Kan wel op Set of Map, maar dan over de Keys of Values ;-)
