Anda di halaman 1dari 45

Java 8:

Create The Future


Simon Ritter
Head of Java Technology Evangelism
Oracle Corp.

Twitter: @speakjava

1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


The following is intended to outline our general product
direction. It is intended for information purposes only, and may
not be incorporated into any contract. It is not a commitment
to deliver any material, code, or functionality, and should not
be relied upon in making purchasing decisions.

The development, release, and timing of any features or


functionality described for Oracle’s products remains at the
sole discretion of Oracle.

2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Java SE 8 New Features
(Other Than Lambdas and Streams)

3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Annotations On Java Types

§  Annotations can currently only be used on type declarations


–  Classes, methods, variable definitions
§  Extension for places where types are used
–  e.g. parameters
§  Permits error detection by pluggable type checkers
–  e.g. null pointer errors, race conditions, etc

public void process(@notnull List data) {…}

4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Access To Parameter Names At Runtime

§  Mechanism to retrieve parameter names of methods and constructors


–  At runtime via core reflection
§  Improved code readability
–  Eliminate redundant annotations
§  Improve IDE capabilities
–  Auto-generate template code
§  Method and Constructor now inherit from new Executable class
–  getParameters() returns array of Parameter objects
–  Name, type, annotations for each parameter

5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Concurrency Updates

§  Scalable update variables


–  DoubleAccumulator, DoubleAdder, etc
–  Multiple variables avoid update contention
–  Good for frequent updates, infrequent reads
§  ConcurrentHashMap updates
–  Improved scanning support, key computation
§  ForkJoinPool improvements
–  Completion based design for IO bound applications
–  Thread that is blocked hands work to thread that is running

6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Parallel Array Sorting

§  Additional utility methods in java.util.Arrays


–  parallelSort (multiple signatures for different primitives)
§  Anticipated minimum improvement of 30% over sequential sort
–  For dual core system with appropriate sized data set
§  Built on top of the fork-join framework
–  Uses Doug Lea’s ParallelArray implementation
–  Requires working space the same size as the array being sorted

7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Date And Time APIs

§  A new date, time, and calendar API for the Java SE platform
§  Supports standard time concepts
–  Partial, duration, period, intervals
–  date, time, instant, and time-zone
§  Provides a limited set of calendar systems and be extensible to others
§  Uses relevant standards, including ISO-8601, CLDR, and BCP47
§  Based on an explicit time-scale with a connection to UTC

8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Unicode 6.2

§  Java SE 7 support Unicode 6.0


§  Changes in Unicode 6.1 (February, 2012)
–  Add 11 new blocks to java.lang.Character.UnicodeBlock
–  Add 7 new scripts to java.lang.Character.UnicodeScript
–  Support over 700 new characters in java.lang.Character, String,
and other classes
§  Changes in Unicode 6.2 (September, 2012)
–  Support a new Turkish currency sign (U+20BA)

9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


HTTP URL Permissions

§  New type of network permission


–  Grant access in terms of URLs, rather than IP addresses
§  Current way to specify network permissions
–  java.net.SocketPermission
–  Not restricted to just HTTP
–  Operates in terms of IP addresses only
§  New, higher level capabilities
–  Support HTTP operations (POST, GET, etc)
–  Build on limited doPrivileged feature

10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Compact Profiles
Approximate static footprint goals

Compact1 Profile
11Mb

Compact2 Profile 16Mb

Compact3 Profile 30Mb

Full JRE 54Mb

11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Nashorn JavaScript Engine

§  Lightweight, high-performance JavaScript engine


–  Integrated into JRE
§  Use existing javax.script API
§  ECMAScript-262 Edition 5.1 language specification compliance
§  New command-line tool, jjs to run JavaScript
§  Internationalised error messages and documentation

12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Retire Rarely-Used GC Combinations

§  Rarely used


–  DefNew + CMS
–  ParNew + SerialOld
–  Incremental CMS
§  Large testing effort for little return
§  Will generate deprecated option messages
–  Won’t disappear just yet

13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Remove The Permanent Generation
Permanently
§  No more need to tune the size of it
§  Current objects moved to Java heap or native memory
–  Interned strings
–  Class metadata
–  Class static variables
§  Part of the HotSpot, JRockit convergence

14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Lambdas And Streams

15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Concurrency in Java Project Lambda

Fork/Join Framework
java.util.concurrent (jsr166y)
(jsr166)
Phasers, etc
java.lang.Thread (jsr166)

1.4 5.0
2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
6 7 8
16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
The Problem: External Iteration
List<Student> students = ... •  Our code controls iteration
double highestScore = 0.0; •  Inherently serial: iterate from
for (Student s : students) { beginning to end
if (s.getGradYear() == 2011) { •  Not thread-safe because
if (s.getScore() > highestScore) { business logic is stateful
highestScore = s.getScore(); (mutable accumulator
} variable)
}
}

17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Internal Iteration With Inner Classes
More Functional, Fluent
List<Student> students = ... §  Iteration handled by the library
double highestScore = students. §  Not inherently serial – traversal
filter(new Predicate<Student>() { may be done in parallel
public boolean op(Student s) {
§  Traversal may be done lazily – so
return s.getGradYear() == 2011;
one pass, rather than three
}
}). §  Thread safe – client logic is
map(new Mapper<Student,Double>() { stateless
public Double extract(Student s) { §  High barrier to use
return s.getScore(); –  Syntactically ugly
}
}).
max();
18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Internal Iteration With Lambdas
SomeList<Student> students = ...
double highestScore = students.
filter(Student s -> s.getGradYear() == 2011).
map(Student s -> s.getScore()).
max();
•  More readable
•  More abstract
•  Less error-prone

19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Lambda Expressions
Some Details
§  Lambda expressions represent anonymous functions
–  Same structure as a method
§  typed argument list, return type, set of thrown exceptions, and a body
–  Not associated with a class
§  We now have parameterised behaviour, not just values
double highestScore = students.
filter(Student s -> s.getGradYear() == 2011).
What map(Student s -> s.getScore())
max();

How
20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Lambda Expression Types
•  Single-method interfaces are used extensively in Java
–  Definition: a functional interface is an interface with one abstract method
–  Functional interfaces are identified structurally
–  The type of a lambda expression will be a functional interface
§  Lambda expressions provide implementations of the abstract method

interface Comparator<T> { boolean compare(T x, T y); }


interface FileFilter { boolean accept(File x); }
interface Runnable { void run(); }
interface ActionListener { void actionPerformed(…); }
interface Callable<T> { T call(); }

21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Local Variable Capture

•  Lambda expressions can refer to effectively final local variables from


the enclosing scope
•  Effectively final: A variable that meets the requirements for final variables
(i.e., assigned once), even if not explicitly declared final
•  Closures on values, not variables

void expire(File root, long before) {


root.listFiles(File p -> p.lastModified() <= before);
}

22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


What Does ‘this’ Mean For Lambdas?
•  ‘this’ refers to the enclosing object, not the lambda itself
•  Think of ‘this’ as a final predefined local
•  Remember the Lambda is an anonymous function

class SessionManager {
long before = ...;

void expire(File root) {


// refers to ‘this.before’, just like outside the lambda
root.listFiles(File p -> checkExpiry(p.lastModified(), this.before));
}

boolean checkExpiry(long time, long expiry) { ... }


}

23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Type Inference
§  The compiler can often infer parameter types in a lambda expression
§  Inferrence based on the target functional interface’s method signature

static T void sort(List<T> l, Comparator<? super T> c);

List<String> list = getList();


Collections.sort(list, (String x, String y) -> x.length() - y.length());

Collections.sort(list, (x, y) -> x.length() - y.length());

§  Fully statically typed (no dynamic typing sneaking in)


–  More typing with less typing
24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Method References

•  Method references let us reuse a method as a lambda expression


•  Also work for constructors

FileFilter x = File f -> f.canRead();

FileFilter x = File::canRead;

25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Library Evolution

26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Library Evolution Goal
§  Requirement: aggregate operations on collections
–  New methods required on Collections to facilitate this

int heaviestBlueBlock = blocks.


filter(b -> b.getColor() == BLUE).
map(Block::getWeight).
reduce(0, Integer::max);

§  This is problematic


–  Can’t add new methods to interfaces without modifying all implementations
–  Can’t necessarily find or control all implementations

27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Solution: Default Methods

•  Specified in the interface


•  From the caller’s perspective, just an ordinary interface method
•  Provides a default implementation
•  Default only used when implementation classes do not provide a body for
the extension method
•  Implementation classes can provide a better version, or not

interface Collection<E> {
default Stream<E> stream() {
return StreamSupport.stream(spliterator());
}
}
28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Virtual Extension Methods
Stop right there!
•  Err, isn’t this implementing multiple inheritance for Java?
•  Yes, but Java already has multiple inheritance of types
•  This adds multiple inheritance of behavior too
•  But not state, which is where most of the trouble is
•  Can still be a source of complexity
•  Class implements two interfaces, both of which have default methods
•  Same signature
•  How does the compiler differentiate?
•  Static methods also allowed in interfaces in Java SE 8

29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Functional Interface Definition

§  Single Abstract Method (SAM) type


§  A functional interface is an interface that has one abstract method
–  Represents a single function contract
–  Doesn’t mean it only has one method
§  Interfaces can now have static methods
§  @FunctionalInterface annotation
–  Helps ensure the functional interface contract is honoured
–  Compiler error if not a SAM

30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Lambdas In Full Flow:
Streams

31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Stream Overview
Pipeline
§  A stream pipeline consists of three types of things
–  A source
–  Zero or more intermediate operations
–  A terminal operation
§  Producing a result or a side-effect Source
int sum = transactions.stream().
filter(t -> t.getBuyer().getCity().equals(“London”)).
mapToInt(Transaction::getPrice).
sum();
Intermediate operation
Terminal operation
32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Stream Sources
Many Ways To Create
§  From collections and arrays
–  Collection.stream()
–  Collection.parallelStream()
–  Arrays.stream(T array) or Stream.of()
§  Static factories
–  IntStream.range()
–  Files.walk()
§  Roll your own
–  java.util.Spliterator

33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


map and flatMap
Map Values in a Stream
§  map (one to one)
–  Each element of the input stream is mapped to an element in the output
stream
§  flatMap (one to many)
–  Each element of the input stream is mapped to a new stream
–  Streams from all elements are concatenated to form one output stream

34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Optional<T>
Reducing NullPointerException Occurrences
§  Indicates that reference may, or may not have a value
–  Makes developer responsible for checking
–  A bit like a stream that can only have zero or one elements

Optional<GPSData> maybeGPS = Optional.ofNullable(gpsData);

maybeGPS.ifPresent(GPSData::printPosition);

GPSData gps = maybeGPS.orElse(new GPSData());

maybeGPS.filter(g -> g.lastRead() < 2).ifPresent(GPSData.display());

35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 1
Convert words in list to upper case

List<String> output = wordList.


stream().
map(String::toUpperCase).
collect(Collectors.toList());

36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 1
Convert words in list to upper case (in parallel)

List<String> output = wordList.


parallelStream().
map(String::toUpperCase).
collect(Collectors.toList());

37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 2
Find words in list with even length

List<String> output = wordList.


parallelStream().
filter(w -> (w.length() & 1) == 0).
collect(Collectors.toList());

38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 3
Count lines in a file
§  BufferedReader has new method
–  Stream<String> lines()

long count = bufferedReader.


lines().
count();

39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 4
Join lines 3-4 into a single string

String output = bufferedReader.


lines().
skip(2).
limit(2).
collect(Collectors.joining());

40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 5
Collect all words in a file into a list

List<String> output = reader.


lines().
flatMap(line -> Stream.of(line.split(REGEXP))).
filter(word -> word.length() > 0).
collect(Collectors.toList());

41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 6
List of unique words in lowercase, sorted by length

List<String> output = reader.


lines().
flatMap(line -> Stream.of(line.split(REGEXP))).
filter(word -> word.length() > 0).
map(String::toLowerCase).
distinct().
sorted((x, y) -> x.length() - y.length()).
collect(Collectors.toList());

42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Example 7: Real World
Infinite stream from thermal sensor

thermalReader
.lines()
.mapToDouble(s ->
Double.parseDouble(s.substring(0, s.length() - )))
.map(t -> ((t – 32) / 5 / 9)
.filter(t -> t != currentTemperature)
.peek(t -> listener.ifPresent(l -> l.temperatureChanged(t)))
.forEach(t -> currentTemperature = t);

43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Conclusions

§  Java SE 8 is a significant change to Java


–  New features in language, libraries and VM
§  Java needs lambda statements
–  Significant improvements in existing libraries are required
§  Require a mechanism for interface evolution
–  Solution: virtual extension methods
§  Bulk operations on Collections
–  Much simpler with Lambdas
§  Java will continue to evolve to meet developer's needs

44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.


Graphic Section Divider

45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.

Anda mungkin juga menyukai