charlie garrod michael hilton
play

Charlie Garrod Michael Hilton School of Computer Science 15-214 1 - PowerPoint PPT Presentation

Principles of So3ware Construc9on: Objects, Design, and Concurrency Part 6: Et cetera Java lambdas and streams Charlie Garrod Michael Hilton School of Computer Science 15-214 1 Administrivia Homework 5 Best Frameworks available tonight?


  1. Principles of So3ware Construc9on: Objects, Design, and Concurrency Part 6: Et cetera Java lambdas and streams Charlie Garrod Michael Hilton School of Computer Science 15-214 1

  2. Administrivia • Homework 5 Best Frameworks available tonight? • Homework 5c due Monday 11:59 p.m. 15-214 2

  3. Key concepts from Tuesday 15-214 3

  4. TCP networking in Java: java.net • IP Address: InetAddress : static InetAddress getByName(String host); static InetAddress getByAddress(byte[] b); • Ordinary socket: Socket : Socket(InetAddress addr, int port); InputStream getInputStream(); OutputStream getOutputStream(); void close(); • Server socket: ServerSocket : ServerSocket(int port); Socket accept(); void close(); … 15-214 4

  5. Parallel prefix sums algorithm, upsweep • Computes the par9al sums in a more useful manner [13, 9, -4, 19, -6, 2, 6, 3] [13, 22, -4, 15, -6, -4, 6, 9] [13, 22, -4, 37, -6, -4, 6, 5] [13, 22, -4, 37, -6, -4, 6, 42] … 15-214 5

  6. Parallel prefix sums algorithm, downsweep • Now unwinds to calculate the other sums [13, 22, -4, 37, -6, -4, 6, 42] [13, 22, -4, 37, -6, 33, 6, 42] [13, 22, 18, 37, 31, 33, 39, 42] • Recall, we started with: [13, 9, -4, 19, -6, 2, 6, 3] 15-214 6

  7. Doubling array size adds two more levels Upsweep Downsweep 15-214 7

  8. Fork/Join: computa9onal pa\ern for parallelism • Fork a task into subtasks • Join the subtasks (i.e., wait for them to complete) • Subtasks are decomposed recursively • The java.util.concurrent.ForkJoinPool class – Implements ExecutorService – Executes java.util.concurrent.ForkJoinTask<V> or java.util.concurrent.RecursiveTask<V> or java.util.concurrent.RecursiveAction • The threads in the fork-join pool do work stealing 15-214 8

  9. Parallel prefix sums algorithm • Sequen9al algorithm: O(n) – n-1 addi9ons – Memory access is sequen9al – See PrefixSumsSequential.java • Parallel algorithm: O(n) work, O(log n) span! – About 2n useful addi9ons, plus extra addi9ons for the loop indexes – Memory access is non-sequen9al – See PrefixSumsParallel.java • The punchline: – Don't roll your own – Cache and constants ma\er – The best parallel implementa9on was no faster than naïve sequen9al 15-214 9

  10. Today • Java lambdas and func9onal interfaces • Java streams 15-214 10

  11. Lambdas, briefly • Term comes from λ-Calculus – Everything is a func9on! • A lambda (λ) is an anonymous func9on 15-214 11

  12. Does Java have lambdas? A. Yes, it’s had them since the beginning B. Yes, it’s had them since anonymous classes (1.1) C. Yes, it’s had them since Java 8 — the spec says so! D. No, never had ’em, never will 15-214 12

  13. Func9on objects in Java 1.0 class StringLengthComparator implements Comparator { private StringLengthComparator() { } public static final StringLengthComparator INSTANCE = new StringLengthComparator(); public int compare(Object o1, Object o2) { String s1 = (String) o1, s2 = (String) o2; return s1.length() - s2.length(); } } Arrays.sort(words, StringLengthComparator.INSTANCE); 15-214 13

  14. Func9on objects in Java 1.1 Arrays.sort(words, new Comparator() { public int compare(Object o1, Object o2) { String s1 = (String) o1, s2 = (String) o2; return s1.length() - s2.length(); } }); "Class Instance Crea9on Expression" (CICE) 15-214 14

  15. Func9on objects in Java 5 Arrays.sort(words, new Comparator<String>() { public int compare(String s1, String s2) { return s1.length() - s2.length(); } }); CICE with generics 15-214 15

  16. Func9on objects in Java 8 Arrays.sort(words, (s1, s2) -> s1.length() - s2.length()); • They feel like lambdas, they’re called lambdas 15-214 16

  17. Lambda syntax Syntax Example parameter -> expression x -> x * x parameter -> block s -> { System.out.println(s); } (parameters) -> expression (x, y) -> Math.sqrt(x*x + y*y) (parameters) -> block (s1, s2) -> { System.out.println(s1 + "," + s2); } (parameter decls) -> expression (double x, double y) -> Math.sqrt(x*x + y*y) (parameters decls) -> block (List<?> list) -> { Arrays.shuffle(list); Arrays.sort(list); } 15-214 17

  18. Method references: more succinct than lambdas • A sta9c method – e.g., Math::cos • An unbound instance method (whose receiver is unspecified) – e.g., String::length – The resul9ng func9on has an extra argument for the receiver • A bound instance method of a specific object – e.g., System.out::println • A constructor – e.g., Integer::new, String[]::new 15-214 18

  19. No func9on types in Java, only func4onal interfaces • Interfaces with only one abstract method • Op9onally annotated with @FunctionalInterface • Some func9onal interfaces you know – java.lang.Runnable – java.util.concurrent.Callable – java.util.Comparator – java.awt.event.ActionListener – Many, many more in java.util.function 15-214 19

  20. Func9on interfaces in java.util.function BiConsumer<T,U> IntUnaryOperator BiFunction<T,U,R> LongBinaryOperator BinaryOperator<T> LongConsumer BiPredicate<T,U> LongFunction<R> BooleanSupplier LongPredicate Consumer<T> LongSupplier DoubleBinaryOperator LongToDoubleFunction DoubleConsumer LongToIntFunction DoubleFunction<R> LongUnaryOperator DoublePredicate ObjDoubleConsumer<T> DoubleSupplier ObjIntConsumer<T> DoubleToIntFunction ObjLongConsumer<T> DoubleToLongFunction Predicate<T> DoubleUnaryOperator Supplier<T> Function<T,R> ToDoubleBiFunction<T,U> IntBinaryOperator ToDoubleFunction<T> IntConsumer ToIntBiFunction<T,U> IntFunction<R> ToIntFunction<T> IntPredicate ToLongBiFunction<T,U> IntSupplier ToLongFunction<T> IntToDoubleFunction UnaryOperator<T> IntToLongFunction 15-214 20

  21. Some Function<String,Integer> Descrip<on Code Lambda s -> Integer.parseInt(s) Lambda w/ explicit param type (String s) -> Integer.parseInt(s) Sta9c method reference Integer::parseInt Constructor reference Integer::new Instance method reference String::length Anonymous class ICE new Function<String, Integer>(){ public Integer apply(String s) { return s.length(); } } 15-214 21

  22. Java streams • A stream is a bunch of data objects, typically from a collec9on, array, or input device, for processing • Processed by a pipeline – A single stream generator (data source) – Zero or more intermediate stream opera.ons – A single terminal stream opera.on 15-214 22

  23. Stream examples: Itera9on // Iteration over a collection static List<String> stringList = ...; stringList.stream() .forEach(System.out::println); // Iteration over a range of integers IntStream.range(0, 10) .forEach(System.out::println); // A mini puzzler: what does this print? "Hello world!".chars() .forEach(System.out::print); 15-214 23

  24. Puzzler solu9on "Hello world!".chars() .forEach(System.out::print); Prints "721011081081113211911111410810033" The chars method on String returns an IntStream 15-214 24

  25. How do you fix it? "Hello world!".chars() .forEach(x -> System.out.print((char) x)); • Now prints "Hello world!" • Morals: – Streams only for object ref types, int , long , and double – Type inference can be confusing 15-214 25

  26. Stream examples: mapping, filtering List<String> longStrings = stringList.stream() .filter(s -> s.length() > 42) .collect(Collectors.toList()); List<String> firstLetters = stringList.stream() .map(s -> s.substring(0,1)) .collect(Collectors.toList()); List<String> firstLetterOfLongStrings = stringList.stream() .filter(s -> s.length() > 42) .map(s -> s.substring(0,1)) .collect(Collectors.toList()); 15-214 26

  27. Stream examples: duplicates, sor9ng List<String> dupsRemoved = stringList.stream() .map(s -> s.substring(0,1)) .distinct() .collect(Collectors.toList()); List<String> sortedList = stringList.stream() .map(s -> s.substring(0,1)) .sorted() // Buffers everything until terminal op .collect(Collectors.toList()); 15-214 27

  28. Stream examples: bulk predicates boolean allStringHaveLengthThree = stringList.stream() .allMatch(s -> s.length() == 3); boolean anyStringHasLengthThree = stringList.stream() .anyMatch(s -> s.length() == 3); 15-214 28

  29. Streams are processed lazily • Data is pulled by terminal opera9on, not pushed by source – Infinite streams are not a problem • Intermediate opera9ons can be fused – Mul9ple intermediate opera9ons usually don’t cause mul9ple traversals • Intermediate results usually not stored – But there are excep9ons (e.g., sorted) 15-214 29

  30. Easy parallelism: .parallelStream() List<String> longStrings = stringList.parallelStream() .filter(s -> s.length() > 42) .collect(Collectors.toList()); List<String> firstLetters = stringList.parallelStream() .map(s -> s.substring(0,1)) .collect(Collectors.toList()); List<String> firstLetterOfLongStrings = stringList.parallelStream() .filter(s -> s.length() > 42) .map(s -> s.substring(0,1)) .collect(Collectors.toList()); 15-214 30

Recommend


More recommend