Proactive Reactive Who controls LightBulb? Others via power() LightBulb itself Who determines what Switch controls? Switch itself Others via listener Is LightBulb synchronous? Synchronous Asynchronous
public class Switch { interface OnFlipListener { void onFlip(boolean enabled); } void addOnFlipListener(OnFlipListener onFlipListener) { // ...etc... } } • Every listener unique • Code cannot be generalized / built-upon • Every listener requires direct access to Switch • Listenable not something that can be passed around
int two = add(1, 1); public static int add(int a, int b) { System.out.println("You're an idiot for using this function!"); System.exit(1010101); return a + b; }
int two = add(1, 1); public static int add(int a, int b) { System.out.println("You're an idiot for using this function!"); System.exit(1010101); return a + b; }
int two = add(1, 1); public static int add(int a, int b) { System.out.println("You're an idiot for using this function!"); System.exit(1010101); return a + b; }
int two = add(1, 1); public static int add(int a, int b) { System.out.println("You're an idiot for using this function!"); System.exit(1010101); return a + b; }
int two = add(1, 1); public static int add(int a, int b) { System.out.println("You're an idiot for using this function!"); System.exit(1010101); return a + b; } Side effects SUCK
List numbers = new ArrayList<>(Arrays.asList(1, 2, 3)); boolean sumEqualsProduct = sum(numbers) == product(numbers); public static int sum(List numbers) { int total = 0; Iterator it = numbers.iterator(); while(it.hasNext()) { total += it.next(); it.remove(); } return total; }
List numbers = new ArrayList<>(Arrays.asList(1, 2, 3)); boolean sumEqualsProduct = sum(numbers) == product(numbers); public static int sum(List numbers) { int total = 0; Iterator it = numbers.iterator(); while(it.hasNext()) { total += it.next(); it.remove(); } return total; }
List numbers = new ArrayList<>(Arrays.asList(1, 2, 3)); boolean sumEqualsProduct = sum(numbers) == product(numbers); public static int sum(List numbers) { int total = 0; Iterator it = numbers.iterator(); while(it.hasNext()) { total += it.next(); it.remove(); } return total; } Side effects SUCK
Side Effects • No input List reticulateSplines() • No output void consume(Food food) • Output cannot be derived from input List getResults(int limit) • Modifies parameters void getHitRect(Rect outRect)
public static List doubleValues(List input) { List output = new ArrayList<>(); for (Integer value : input) { output.add(value * 2); } return output; } Inflexible!
public interface Function { Integer apply(Integer int); }
public static List map(List input, Function fun) { List output = new ArrayList<>(); for (Integer value : input) { output.add(fun.apply(value)); } return output; }
public interface Function { Integer apply(Integer int); }
public static List map(List input, Function fun) { List output = new ArrayList<>(); for (Integer value : input) { output.add(fun.apply(value)); } return output; }
public interface Function { Integer apply(Integer int); }
public static List map(List input, Function fun) { List output = new ArrayList<>(); for (Integer value : input) { output.add(fun.apply(value)); } return output; }
public static List map(List input, Function fun) { List output = new ArrayList<>(); for (T value : input) { output.add(fun.apply(value)); } return output; }
List numbers = Arrays.asList(1, 2, 3); List doubled = map(numbers, i -> i * 2); List words = Arrays.asList("one", "two", "three"); List lengths = map(words, s -> s.length());