Java 8 Tutorial
Overview
New Features
Lambda expression − Adds functional processing capability to Java.
Method references − Referencing functions by their names instead of invoking them directly. Using functions as parameter.
Default method − Interface to have default method implementation.
New tools − New compiler tools and utilities are added like ‘jdeps’ to figure out dependencies.
Stream API − New stream API to facilitate pipeline processing.
Date Time API − Improved date time API.
Optional − Emphasis on best practices to handle null values properly.
Nashorn, JavaScript Engine − A Java-based engine to execute JavaScript code.
Lambda Expressions
Syntax
parameter -> expression body
Lambda Expressions Example
MathOperation addition = (int a, int b) -> a + b;
GreetingService greetService1 = message -> System.out.println("Hello " + message);
LambdaSort
LambdaMathService
Method References
List names = new ArrayList();
names.forEach(System.out::println);
MethodReferences
Functional Interfaces
FunctionalInterfaces
Default Methods
Syntax
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
Multiple Defaults
public interface fourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
public class car implements vehicle, fourWheeler {
public void print() {
System.out.println("I am a four wheeler car vehicle!");
}
}
Static Default Methods
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
DefaultMethods
Streams
Generating Streams
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
forEach
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
map
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
filter
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();
limit
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
sorted
Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);
Parallel Processing
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Collectors
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);
Statistics
List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Highest number in List : " + stats.getMax());
System.out.println("Lowest number in List : " + stats.getMin());
System.out.println("Sum of all numbers : " + stats.getSum());
System.out.println("Average of all numbers : " + stats.getAverage());
Streams
Optional Class
Class Declaration
public final class Optional<T> extends Object
OptionalClass
Nashorn JavaScript
NashornJavaScript
New Date/Time API
LocalDateTimeAPI
ZonedDateTimeAPI
ChronoUnitsEnum
PeriodAndDuration
TemporalAdjusters
BackwardCompatibility
Base64
Base64Example