Download presentation
Presentation is loading. Please wait.
Published byErica Welch Modified over 9 years ago
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) http://steve-yegge.blogspot.co.il/2006/03/execution-in-kingdom-of-nouns.html http://steve-yegge.blogspot.co.il/2006/03/execution-in-kingdom-of-nouns.html 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 convenience @FunctionalInterface annotation to tell the compiler that the interface should be functional (a la @Override ) Author: Assaf Israel - Technion 2013 © 15 new Thread(new Runnable() { @Override public void run() { System.out.println("Kill me :("); } }).start(); new Thread(() -> System.out.println("Woohoo! :D")).start(); @FunctionalInterface 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!');");
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.