Presentation is loading. Please wait.

Presentation is loading. Please wait.

Java 8 Technion – Institute of Technology Software Design (236700) Based on slides by: Sagie Davidovich, Assaf Israel Author: Assaf Israel - Technion 2013.

Similar presentations


Presentation on theme: "Java 8 Technion – Institute of Technology Software Design (236700) Based on slides by: Sagie Davidovich, Assaf Israel Author: Assaf Israel - Technion 2013."— Presentation transcript:

1 Java 8 Technion – Institute of Technology Software Design (236700) Based on slides by: Sagie Davidovich, Assaf Israel Author: Assaf Israel - Technion 2013 © 1

2 Life before Java 8 (cont.) Extracting employee names Extracting employee ages Author: Assaf Israel - Technion 2013 © 2 public List empNames(List employees) { List result = new ArrayList<>(); for (Employee emp: employees) result.add(emp.getName()); return result; } public List empAges(List employees) { List result = new ArrayList<>(); for (Employee emp: employees) result.add(emp.getAge()); return result; } DuplicationVariation

3 Life before Java 8 (cont.) Lets identify the control structure, and extract the behavior into an object Author: Assaf Israel - Technion 2013 © 3 public List empNames(List employees){ List result = new ArrayList<>(); for (Employee emp: employees) { result.add(emp.getName()); } return result; } public interface Mapper { public T map(U u); } public List map(List aList, Mapper mapper) { List result = new ArrayList<>(); for (U u: aList) { result.add(mapper.map(u)); } return result; }

4 Life before Java 8 (cont.) Extracting employee names Extracting employee ages Author: Assaf Israel - Technion 2013 © 4 List empNames = map(employees, new Mapper () { public String map(Employee e) { e.getName(); } }); List empAges = map(employees, new Mapper () { public Integer map(Employee e) { e.getAge(); } });

5 In the Kingdom of Nouns We removed the code duplication, but this is still very verbose…  Semantically, map is a higher level function  This means that it accepts a function as an argument or returns a function  Syntactically, functions do not exist as first class entities  All verbs (functions) have be accompanied by a noun (class)   Prior to Java 8, Java was the only programming languages in popular use without anonymous functions / blocks / lambdas / function pointers Author: Assaf Israel - Technion 2013 © 5

6 Enter Java 8! Extracting employee names Extracting employee ages Author: Assaf Israel - Technion 2013 © 6 List empNames = employees.stream().map(x -> x.getName()).collect(Collectors.toList()); List empAge = employees.stream().map(x -> x.getAge()).collect(Collectors.toList());

7 Let’s take a deeper look…  stream is a default method of List  map is a higher level function of stream  x -> x.getName() is a lambda expression  collect turns the stream back to a normal Collection (in our case, a List ) Author: Assaf Israel - Technion 2013 © 7 List empNames = employees.stream().map(x -> x.getName()).collect(Collectors.toList());

8 Default methods  default methods are default implementations for interfaces  This way you can add new functionality to an existing interface without breaking all depending code!  In our case, we added the stream() method to Collection  So is this the same as multiple inheritance ?  Not exactly, the behavior more closely resembles Traits, which we will discuss in detail when talk about Scala  So are these extension methods (a la C#)?  No, because extension methods are actually syntactic sugar for static decorators  You can’t add methods yourself (e.g., in C# you can add extension methods to String ). Author: Assaf Israel - Technion 2013 © 8 List empNames = employees.stream().map(x -> x.getName()).collect(Collectors.toList());

9 Higher order functions  map is a high order function in stream  There are other similar higher order functions in stream  filter, map, flatmap, sorted, reduce… Author: Assaf Israel - Technion 2013 © 9 List empNames = employees.stream().map(x -> x.getName()).collect(Collectors.toList());

10 Higher order functions – API examples  Assure we are not hiring anyone underage  Find the highest paid individual in the company  But what is returned if the list is empty?  Instead of working with null, a new type called Optional is returned  Optional can be present (i.e. not null ) or not (i.e. null )  Has a method get() that returns T or throws an exception  Optional itself has higher order functions Author: Assaf Israel - Technion 2013 © 10 employees.stream().noneMatch(x -> x.age < 18); Optional ageOfRichest = $.map(x -> x.getAge); Optional $ = employees.stream().max((x,y) -> x.salary – y.salary);

11 Higher order functions – Map-Reduce  Sum all salaries in the company  There are programming models that work on the MapReduce principle  e.g. Hadoop  collect is actually a form of mutable reduction  i.e., it reduces to a mutable container Author: Assaf Israel - Technion 2013 © 11 employees.stream().mapToInt(x -> x.getAge()) // note the mapToInt.reduce(0, Integer::sum()) // could also be done with Lambdas, or simply.sum()

12 Higher Order function – A more complex example  Get Israeli students with a top grade sorted by name (in Java 7)  In java 8: Author: Assaf Israel - Technion 2013 © 12 List topGrades = new ArrayList<>(); Collections.sort(students, new Comparator () { // sorts in place! public int compare(Student student1, Student student2) { return student1.getName().compareTo(student2.getName()); } }); for (Student student: students) if (student.getCountry() == "Israel") if (student.getGrade() >= 90) topGrades.add(student); List topStudents = students.stream().filter(x -> x.getCountry() == "Israel").filter(x -> x.getGrade() > 90).sorted((x,y) -> x.getName().compareTo(y.getName())).collect(Collectors.toList());

13 Streams Author: Assaf Israel - Technion 2013 © 13  We only iterate over a stream once, even though we have 2 (or more) higher level functions  This is because streams are lazily evaluated  until we call collect, no iteration takes place  Streams also give us “free” parallelization List topStudents = students.stream().parallel().filter(x -> x.getCountry() == "Israel").filter(x -> x.getGrade() > 90).sorted((x, y) -> y.getGrade() - x.getGrade()).collect(Collectors.toList());

14 Lambdas  The signature for map is: map(Function mapper)  And here is the signature for Function:  An interface which has single abstract (i.e., non- default ) method can be called a Functional Interface  Lambdas are syntactic sugar for implementing Functional Interfaces Author: Assaf Israel - Technion 2013 © 14 List empNames = employees.stream().map(x -> x.getName()).collect(Collectors.toList()); interface Function { R apply(T t); // retracted default methods }

15 Lambdas (cont.) We can also use lambda with “old” API  Old code  New code  We can use the annotation to tell the compiler that the interface should be functional (a ) Author: Assaf Israel - Technion 2013 © 15 new Thread(new Runnable() public void run() { System.out.println("Kill me :("); } }).start(); new Thread(() -> System.out.println("Woohoo! interface I { void A(); void B(); } // won’t compile

16 What else is new in Java 8?  New Date and Time APIs  Everything is now immutable  Support for unsigned arithmetic  Embedding JavaScript code in Java  Better integeration with JavaFX  A java library for developing rich client applications Author: Assaf Israel - Technion 2013 © 16 ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(“console.log('Hello World!');");


Download ppt "Java 8 Technion – Institute of Technology Software Design (236700) Based on slides by: Sagie Davidovich, Assaf Israel Author: Assaf Israel - Technion 2013."

Similar presentations


Ads by Google