mohsen zainalpour [email protected] what`s new in java 8 jug

75
Mohsen Zainalpour [email protected] What`s New in Java 8 JUG

Upload: arnold-adams

Post on 02-Jan-2016

214 views

Category:

Documents


0 download

TRANSCRIPT

Mohsen [email protected]

What`s New in Java 8

JUG

• 2012/04/26 M1• 2012/06/14 M2• 2012/08/02 M3• 2012/09/13 M4• 2012/11/29 M5• 2013/01/31 M6• 2013/06/13 M7 Feature Complete• 2013/09/05 M8 Developer Preview• 2014/01/23 M9 Final Release Candidate• 2014/03/18 GA General Availability

JDK 8Schedule and status

Major changes

Agenda

JUG

Why is Java still changing?

Type Annotations

Lambda Project

Date and Time API

Compact Profiles

1

2

3

4

5

Java 8 Is Revolutionary, Java Is Back

“Lambda is the single largest upgrade to the programming model. Ever. It's larger even than Generics. It's the first time since the beginning of Java that we've done a carefully coordinated co-evolution of the virtual machine, the language and the libraries, all together. Yet the result still feels like Java.  Mark Reinhold (Chief Architect of the Java Platform Group at Oracle)

Java 8 Is Revolutionary, Java Is Back

“Lambda is the single largest upgrade to the programming model. Ever. It's larger even than Generics. It's the first time since the beginning of Java that we've done a carefully coordinated co-evolution of the virtual machine, the language and the libraries, all together. Yet the result still feels like Java.  Mark Reinhold (Chief Architect of the Java Platform Group at Oracle)

LambdaJSR 335

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

Why is Java still changing?

The changing computing background

Increasingly dealing with big data (terabytes and up) and wishing to exploit multicore computers or computing clusters effectively to process this.

And this means using:

parallel processing

big data multicore cloud computing

The Progress of Programming

There`s been a lot of progress

&

Progress is being allowed to forget things!

The Progress of Programming

There`s been a lot of progress:

- Assemblers let us forget opcodes

The Progress of Programming

There`s been a lot of progress:

- Assemblers let us forget opcodes- Garbage collections let us forget memory management

#include <stdio.h> #include <stdlib.h> int main () {…

buffer = (char*) malloc (i+1); …

free (buffer);…}

The Progress of Programming

So what about parallelism?

Why Can`t We Forget About Parallelism?

Most of parallelism problems are doing bulk operations on collection

and we keep writing code like this:

int sum = 0; for (int i = 0; i < a.length; i++) { sum += a[i]; }

It is inherently serial

Why Can`t We Forget About Parallelism?

If the processing of different elements is to proceed in parallel, it is the responsibility of the client code

Why Can`t We Forget About Parallelism?

If the processing of different elements is to proceed in parallel, it is the responsibility of the client code

n1 n2 n3 n4 n5 n6 n7 n8 n9 … … … …

sum1 sum2 sum3 sum4

Why Can`t We Forget About Parallelism?

If the processing of different elements is to proceed in parallel, it is the responsibility of the client code

n1 n2 n3 n4 n5 n6 n7 n8 n9 … … … …

class Sum implements Callable<Long> {private final long from;private final long to;Sum(long from, long to) {

this.from = from;this.to = to;

}public Long call() {

long acc = 0;for (long i = from; i <= to; i++) {

acc = acc + i;}return acc;}

}

sum1 sum2 sum3 sum4

Why Can`t We Forget About Parallelism?

If the processing of different elements is to proceed in parallel, it is the responsibility of the client code

n1 n2 n3 n4 n5 n6 n7 n8 n9 … … … …

sum1 sum2 sum3 sum4

ExecutorService executor = Executors.newFixedThreadPool(2);List<Future<Long>> results = executor.invokeAll(asList(

new Sum(1, 250),new Sum(251, 500),new Sum(551, 750),new Sum(751, 1000)

));for (Future<Long> result : results) {

System.out.println(result.get());}

Why Can`t We Forget About Parallelism?

Sequential

Parallel(assuming a quad core machine)

Time t

Thread 1

Thread 1

Thread 2

Thread 3

Thread 4

Done parallel

Done sequential

Why Can`t We Forget About Parallelism?

Let the Library Writers do it!

Collection developers know the recursive structure of their data

But right now they can`t use that knowledge

Why Can`t We Forget About Parallelism?

Let the Library Writers do it!

Collection developers know the recursive structure of their data

But right now they can`t use that knowledge

int sum = 0; for (Iterator<Integer> itr = myList.iterator();itr.hasNext(); ) { sum += itr.next(); }

The problem is external iteration

Why Can`t We Forget About Parallelism?

Internal Iteration

Instead of this:

int sum = 0;

for (int i=0;i<myList.size();i++){

int a=myList.get(i);sum+=a;

}

Why Can`t We Forget About Parallelism?

Internal Iteration

We`re going to write this:

int [] sum = new int[1];

myList.forEach(…

);

Instead of this:

int sum = 0;

for (int i=0;i<myList.size();i++){

int a=myList.get(i);sum+=a;

}

Why Can`t We Forget About Parallelism?

Internal Iteration

• Let the collection choose its iteration strategy- Parallel, serial, out-of-order, lazy, …

We`re going to write this:

int [] sum = new int[1];

myList.forEach(…

);

Instead of this:

int sum = 0;

for (int i=0;i<myList.size();i++){

int a=myList.get(i);sum+=a;

}

Why Can`t We Forget About Parallelism?

Internal Iteration

• Let the collection choose its iteration strategy- Parallel, serial, out-of-order, lazy, …

We`re going to write this:

int [] sum = new int[1];

myList.forEach(a -> sum[0]+=a

);

Instead of this:

int sum = 0;

for (int i=0;i<myList.size();i++){

int a=myList.get(i);sum+=a;

}

Why Can`t We Forget About Parallelism?

a -> sum[0]+=a

Lambda Project – JSR 335

JSR 335 (Lambda Project) aims to support programming in a

multicore environment

by adding closures and related features to the Java language.

What are Lambda Expressions (closures)?

A lambda expression :

What are Lambda Expressions (closures)?

is an anonymous

method

A lambda expression :

What are Lambda Expressions (closures)?

is an anonymous

method

having an argument

list

A lambda expression :

a ->

What are Lambda Expressions (closures)?

is an anonymous

method

having an argument

list

a return type

A lambda expression :

a ->

What are Lambda Expressions (closures)?

is an anonymous

method

having an argument

list

a return type and a body

A lambda expression :

a -> sum[0]+=a

What are Lambda Expressions (closures)?

is an anonymous

method

having an argument

list

a return type and a body

A lambda expression :

a -> sum[0]+=a

and able to refer to values from the enclosing scope (closure)

What are Lambda Expressions (closures)?

is an anonymous

method

having an argument

list

a return type and a body

A lambda expression :

a -> sum[0]+=a

and able to refer to values from the enclosing scope (closure)

To pass behavior to the API as data

From Single Method Interface ….

public interface Comparator<T> {

}

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}Single Abstract Method (SAM)

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}Single Abstract Method (SAM)

Functional Interface

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}

Collections.sort(strings, new Comparator<String>() {

public int compare(String s1, String s2) {return s1.compareToIgnoreCase(s2);

}});

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}

Collections.sort(strings, new Comparator<String>() {

public int compare(String s1, String s2) {return s1.compareToIgnoreCase(s2);

}});

From Single Method Interface ….

public interface Comparator<T> {int compare(T o1, T o2);

}

Collections.sort(strings, new Comparator<String>() {

public int compare(String s1, String s2) {return s1.compareToIgnoreCase(s2);

}});

Bulky syntax Confusion surrounding the meaning of names and this

… To Lambda Expressions

Collections.sort(strings, (s1, s2) -> s1.compareToIgnoreCase(s2));

… To Lambda Expressions

Collections.sort(strings, (s1, s2) -> s1.compareToIgnoreCase(s2));

… To Lambda Expressions

Collections.sort(strings, (s1, s2) -> s1.compareToIgnoreCase(s2));

Lambda expression are always converted toinstance of a functional interface

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2));

No need of changing the JVM to create a newtype for lambda expressions

… To Lambda Expressions

Collections.sort(strings,

new Comparator<String>() {public int

compare(String s1, String s2) {

return s1.compareToIgnoreCase(s2);}});

Collections.sort(strings,

(s1, s2) -> s1.compareToIgnoreCase(s2)

);

… To Lambda Expressions

Collections.sort(strings,

new Comparator<String>() {public int

compare(String s1, String s2) {

return s1.compareToIgnoreCase(s2);}});

Collections.sort(strings,

(s1, s2) -> s1.compareToIgnoreCase(s2)

);

Simplicity

Without more language support for parallel idioms,people will instinctively reach for serial idioms

External Iteration

Sum of squares

long sum = 0L;for (long i = 0; i < N; i++) {

sum += i * i;}

Internal Iteration

Sum of squares

long sum = LongStream.range(0, N).map(i -> i * i).sum();

Internal Iteration

Going parallel

long sum = LongStream.range(0, N).parallel().map(i -> i * i).sum();

Parallel Streams

A behavioral parameter (lambda) may be invoked concurrently– This constraint gives us “wiggle room” to optimize

Up the level of abstraction

External iteration conflates what with how

Internal iteration: more what; less how

Client passes behavior to the API as data

Library is free to use

Multiple threads

Out-of-order

executionLaziness

Lambdas in Java 8

Lambda

Code as data

(Simplicity)

Multi-core processing / parallel

processing

Interface evolution

Bulk data operations

Lambdas in Java 8

Date and Time APIJSR 310

New Date and Time API

History of Java Date/Time APIs

Java.util.Date, java.util.Calendar- Strong candidates for the all-time worst Java platform library

design

Joda Time- Quality date and time library

JSR-310- Builds on experience of Joda Time

New Date and Time API

Design Principles

Immutable- Thread-safe, allows caching

Fluent- easy to read, like a DSL

LocalDate.of(2013,Month.JANUARY,09).withYear(2014);

New Date and Time API

Time for Humans

Field-base, designed for humans- Year,month,day,hour,minute,second- LocalDate,LocalDateTime,ZonedDateTime,Period …

New Date and Time API

London

12:50

Los Angeles

16:20

New Date and Time API

void flightTime(){

LocalDate date = LocalDate.of(2013, Month.SEPTEMBER, 14);

LocalTime takeoff = LocalTime.of(12, 50);LocalTime landing = LocalTime.of(16, 20);

ZoneId LHR = ZoneId.of("Europe/London");ZoneId SFO = ZoneId.of("America/Los_Angeles");

Duration flightTime = Duration.between(ZonedDateTime.of(date, takeoff, LHR),ZonedDateTime.of(date, landing, SFO));

System.out.println("Flight time: " + flightTime);}

AnnotationsJSR 308

Type Annotations

JSR-308 brings annotations on Type use Are an enabler for the checkers framework

Ex.:

new @Interned MyObject();myString = (@NonNull String) myObject;void monitorTemperature() throws@Critical TemperatureException { ... }

Repeating Annotations

Before@Schedules ({

@Schedule(dayOfMonth="Last"),@Schedule(dayOfWeek="Fri",

hour="23"))}

public void doPeriodicCleanup() { ... }

Repeating Annotations

Before@Schedules ({

@Schedule(dayOfMonth="Last"),@Schedule(dayOfWeek="Fri",

hour="23"))}

public void doPeriodicCleanup() { ... }

After@Schedule(dayOfMonth="Last”)@Schedule(dayOfWeek="Fri", hour="23")public void doPeriodicCleanup() { ... }

Java SE 8 Compact Profiles

Java SE 8 Compact Profiles

SE Full JRE

Hotspot VM

Lang & Util Base Libraries

Other Base Libraries

Integration Libraries

UI & Toolkits

Optional Components

Hotspot VM

Base Compact1 Classes

SE 8 Compact Profiles

Compact2 Class libraries

Compact3 Class libraries

1

2

3

Q&A

References

• Lambdahttp://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambdahttp://openjdk.java.net/projects/lambda/http://jcp.org/aboutJava/communityprocess/edr/jsr335/index2.htmlhttp://vimeo.com/48577033 (slides: http://www.slideshare.net/tkowalcz/java-gets-a-closure)http://datumedge.blogspot.co.uk/2012/06/java-8-lambdas.htmlhttp://www.theserverside.com/news/thread.tss?thread_id=68718http://medianetwork.oracle.com/video/player/1785479333001https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=6080https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=5089http://www.lektorium.tv/lecture/?id=14048http://www.lektorium.tv/lecture/?id=14049http://blog.xebia.com/2012/11/05/report-will-java-8s-lambda-change-the-face-of-the-world/http://www.slideshare.net/fsarradin/java-8-lambdahttp://programmers.stackexchange.com/questions/173441/what-triggered-the-popularity-of-lambda-functions-in-modern-mainstream-programmi?newsletter=1&nlcode=29983%7c903ahttp://www.slideshare.net/bje/java-closures* Collectionshttp://www.javabeat.net/2012/05/enhanced-collections-api-in-java-8-supports-lambda-expressions/http://cr.openjdk.java.net/~briangoetz/lambda/collections-overview.htmlhttp://architects.dzone.com/articles/java-collections-api

References

• Remove the Permanent Generationhttp://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/http://javaeesupportpatterns.blogspot.com/2011/10/java-7-features-permgen-removal.htmlhttp://java.dzone.com/articles/busting-permgen-mythshttps://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=5135• JSR 310: Date and Time APIhttp://java.dzone.com/articles/introducing-new-date-and-timehttp://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTenhttp://www.infoq.com/news/2010/03/jsr-310https://docs.google.com/document/pub?id=1rd8yplQZIRz3LxMzpVLuskr1b0HwBmK9PXpdgBYojSwhttp://sourceforge.net/apps/mediawiki/threeten/index.php?title=User_Guidehttps://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=4350• General Java8http://openjdk.java.net/projects/jdk8/featureshttp://www.pcadvisor.co.uk/news/software/3401314/oracle-java-upgrades-still-worthwhile-despite-postponed-features/http://dhruba.name/2011/07/06/oracle-discusses-java-7-8-new-features-on-video/http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/Java-8http://www.parleys.com/#st=5&id=2850&sl=1http://www.parleys.com/#st=5&id=2847https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=2872https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=10458

References

• Annotationshttps://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=4469https://blogs.oracle.com/abuckley/entry/jsr_308_moves_forwardhttp://jcp.org/en/jsr/detail?id=308http://openjdk.java.net/jeps/120http://types.cs.washington.edu/checker-framework/