• Like

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Uploaded on

 

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,832
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
124
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Java 7 new features Java User Group Latvia www.jug.lv
  • 2. Java 7
    • Project began in August 2006
    • JDK7 is done via Open JDK effort
    • Major release – JVM, language and library changes
    • Current status – milestone M10, build b115, planned release Mid 2011
  • 3. Initially planned features
    • Closures – Project Lambda
    • Small language changes – Project Coin
    • Modularity for Java platform – Project Jigsaw
    • Support for dynamically-typed languages
    • Core and IO library extensions
    • Swing and UI related changes
    • Support for updated standards - Unicode, localization, security, cryptography, XML and JDBC
  • 4. Two release plans
    • Plan A
      • All features, release in Mid 2012
    • Plan B
      • JDK 7 minus Lambda, Jigsaw and part of Coin, release in Mid 2011
      • JDK 8, release in late 2012
  • 5. Plan B selected
    • Plan A
      • All features, release in Mid 2012
    • Plan B
      • JDK 7 minus Lambda, Jigsaw and part of Coin, release in Mid 2011
      • JDK 8, release in late 2012
  • 6. Approved feature list
    • JSR 292: Support for Dynamically-Typed Languages (“InvokeDynamic”)
    • Small Language Enhancements (Project Coin)
    • Concurrency and Collections Updates (including the Fork/Join Framework)
    • Upgrade Class-Loader Architecture
    • Unicode 6.0
    • JSR 203: More New I/O APIs (“NIO 2”)
    • Updated cryptography
    • JDBC 4.1
    • Translucent & Shaped Windows
    • Heavyweight/Lightweight Component Mixing
    • Swing: Nimbus Look-and-Feel, JLayer Component
    • Update the XML Stack (JAXP, JAXB, & JAX-WS)
  • 7. Language enhancements - Project Coin
  • 8. Strings in switch statement
    • GregorianCalendar c = new GregorianCalendar();
    • int monthNameToDays(String s, int year) {
    • switch (s) {
    • case "April": case "June":
    • case "September": case "November":
    • return 30;
    • case "January": case "March":
    • case "May": case "July":
    • case "August": case "December":
    • return 31;
    • case "February":
    • return 28 + (c.isLeapYear(year) ? 1 : 0);
    • default :
    • return -1;
    • }
    • }
  • 9. Improved Type Inference for Generic Instance Creation
    • Map <Integer, List<String>> map =
    • new HashMap <Integer, List<String>> ();
    • New “diamond” operator :
    • Map<Integer, List<String>> map = new HashMap<>();
    • List<?> l = new ArrayList<>();
  • 10. Try-with-resources
    • void copy(String src, String dest) throws IOException {
    • InputStream in = new FileInputStream(src);
    • try {
    • OutputStream out = new FileOutputStream(dest);
    • try {
    • byte[] buf = new byte[8 * 1024];
    • int n;
    • while ((n = in.read(buf)) >= 0)
    • out.write(buf, 0, n);
    • } finally {
    • out.close();
    • }
    • } finally {
    • in.close();
    • }
    • }
  • 11. Try-with-resources
    • void copy(String src, String dest) throws IOException {
    • try (InputStream in = new FileInputStream(src);
    • OutputStream out = new FileOutputStream(dest)) {
    • byte[] buf = new byte[8192];
    • int n;
    • while ((n = in.read(buf)) >= 0)
    • out.write(buf, 0, n);
    • }
    • }
  • 12. Try-with-resources
    • void copy(String src, String dest) {
    • try (InputStream in = new FileInputStream(src);
    • OutputStream out = new FileOutputStream(dest)) {
    • byte[] buf = new byte[8192];
    • int n;
    • while ((n = in.read(buf)) >= 0)
    • out.write(buf, 0, n);
    • } catch (IOException e) {
    • e.printStackTrace();
    • }
    • }
  • 13. Try-with-resources
    • package java.lang;
    • public interface AutoCloseable {
    • void close() throws Exception;
    • }
    • package java.io;
    • public interface Closeable extends AutoCloseable {
    • void close() throws IOException;
    • }
  • 14. Multi-catch
    • try {
    • String. class .newInstance();
    • } catch ( final IllegalAccessException | InstantiationException e) {
    • e.printStackTrace();
    • throw e;
    • } catch (Exception e) {
    • // handle exception
    • }
  • 15. Integer and binary literals
    • byte b = 0b00100101;
    • int phoneNumber = 123_456_7890;
    • long creditCardNumber = 1234_5678_9012_3456L;
    • int hexBytes = 0xFF_EC_DE_5E;
  • 16. Simplified Varargs Method Invocation
    • List<String> a = new ArrayList<String>(),
    • b = new ArrayList<String>(),
    • c = new ArrayList<String>();
    • // Warning: [unchecked] unchecked generic array
    • // creation for varargs parameter of type
    • // List<String>[]
    • return Arrays.asList(a, b, c);
  • 17. Language enhancements postponed until Java 8
  • 18. Language enhancements in Java 8
    • Collection literals and indexing
    • List<String> cities = [&quot;Riga&quot;, &quot;London&quot;, &quot;Tokio&quot;];
    • Set<String> countries = { &quot;LV&quot;, &quot;LT&quot;, &quot;EE&quot; };
    • Map<String, Double> atomicWeights = { &quot;H&quot; : 1.0079,
    • &quot;He&quot; : 4.0026, &quot;Li&quot; : 6.941 };
    • String city = cities[0];
    • Double weight = atomicWeights[&quot;H&quot;];
  • 19. Language enhancements in Java 8
    • Closures
    • #{ int x -> x + 1 }
    • #{ System.out.println(&quot;Hello, World!&quot;) }
    • list.forEach(#{ e -> System.out.println(e) });
    • Arrays.sort(array, #{ a, b -> a.compareToIgnoreCase(b) });
  • 20. Language enhancements in Java 8
    • Method references
    • class Person {
    • public static int compareByAge(Person a, Person b) { ... }
    • }
    • Person[] people = ...
    • Arrays.sort(people, #Person.compareByAge);
    • Arrays.sort(people, #Person.compareByAge(Person, Person));
    • Arrays.sort(people, #comparatorHolder.comparePersonByAge);
  • 21. JSR 292 – Support for Dynamically-Typed languages
  • 22. JSR 292 - Overview
    • Dynamic languages on the JVM
    • JSR 223 implemented in JDK6
    • JVM initially designed for statically-typed language
    • 4 bytecode instructions available for method invocations
      • Invokestatic
      • Invokevirtual
      • Invokespecial
      • Invokeinterface
    • new bytecode instruction &quot;invokedynamic“ and Method Handles
    • java.dyn package
  • 23. JSR 292 – Method Handles
    • Method handle is a lightweight pointer or reference to a method
    • java.dyn.MethodHandle
    • Example
    • public void testMethodHandle() throws Throwable {
    • MethodHandle hndl = MethodHandles.lookup().findVirtual(
    • PrintStream. class , &quot;println&quot;,
    • MethodType.methodType( void.class , String. class ));
    • hndl.< void >invokeGeneric(System.out, &quot;Hello, MethodHandle!&quot;);
    • }
  • 24. JSR 292 Invokedynamic – how it works?
    • JVM encounters invokedynamic instruction
    • JVM invokes the bootstrap method
    • The Bootstrap method resolves the method handle
    • The Bootstrap method must be previously registered in JVM
    • Future calls don't require the Bootstrap method invocation
  • 25. JSR 292 InvokeDynamic, Java example
    • public void testDynamic() throws Throwable {
    • InvokeDynamic.< void >greet(&quot;World&quot;);
    • }
    • static {
    • Linkage.registerBootstrapMethod(&quot;bootstrap&quot;);
    • }
    • public static void greet(String str) {
    • System.out.println(&quot;Hello, dynamic &quot; + str);
    • }
    • private static CallSite bootstrap(Class caller, String name, MethodType type) {
    • CallSite site = new CallSite(caller, name, MethodType.make( void.class ));
    • site.setTarget(MethodHandles.lookup().findStatic(Test. class , name, MethodType.make( void.class , String. class )));
    • return site;
    • }
  • 26. NIO.2
  • 27. NIO.2 – Paths
    • java.nio.file.Path – a replacement for java.io.File
    • File file = new File(&quot;index.html&quot;);
    • Path path = Paths.get(&quot;index.html&quot;);
    • Path path = new File(&quot;index.html&quot;).toPath();
    • All Path methods throw exceptions in case of errors
    if (!file.delete()){ ... } try { path.delete(); } catch (IOException e) { ... }
  • 28. NIO.2 – FileSystem
    • Provides interface to file system
    • Default file system is local/platform file system
    • FileSystem local = FileSystems.getDefault();
    • Path p = local.getPath(“filename&quot;);
    • Path p2 = Paths.get(“filename”);
    • Jar and Zip file systems included
  • 29. NIO.2 – DirectoryStream
    • DirectoryStream to iterate over the entries
    • Scales to large directories
    • Filter using glob, regex, or custom filter
    • try (DirectoryStream<Path> stream =
    • dir.newDirectoryStream(&quot;*.{c,h,cpp,hpp,java}&quot;)) {
    • for (Path entry : stream) {
    • ...
    • }
    • }
  • 30. NIO.2 - Files.walkFileTree
    • Walks a file tree rooted at a given starting file
    • Invoke FileVisitor method for each file/directory
    • interface FileVisitor<T> {
    • FileVisitResult preVisitDirectory(T dir);
    • FileVisitResult visitFile(T file, BasicFileAttributes attrs);
    • FileVisitResult visitFileFailed(T file, IOException exc);
    • FileVisitResult postVisitDirectory(T dir, IOException exc);
    • }
    • SimpleFileVisitor – a default implementation
  • 31. NIO.2 - File change notifications
    • Current approach – polling the file system
    • WatchService – watch registered objects (Watchables) for changes
    • WatchService watcher = path.getFileSystem().newWatchService();
    • path.register(watcher, ENTRY_CREATE, ENTRY_MODIFY);
    • for (;;) {
    • WatchKey watchKey = watcher.take();
    • for (WatchEvent event : watchKey.pollEvents()) {
    • System.out.println(event.kind() + &quot; : “
    • + event.context());
    • }
    • watchKey.reset();
    • }
  • 32. Fork/Join framework
  • 33. Fork/Join Framework
    • Multicore era approaching
    • Moore’s Law doesn’t work since ~2003
    • Current solution (java.util.concurrent) has its limitations
      • Coarse grained parallelism
      • Inefficient CPU utilization
    • Solution: Fork/Join framework
  • 34. Fork/Join – Divide and conquer
    • Result solve(Problem problem) {
    • if (problem.size < SEQUENTIAL_THRESHOLD)
    • return solveSequentially(problem);
    • else {
    • Result left, right;
    • INVOKE-IN-PARALLEL {
    • left = solve(extractLeftHalf(problem));
    • right = solve(extractRightHalf(problem));
    • }
    • return combine(left, right);
    • }
    • }
  • 35. Fork/Join - architecture
    • ForkJoinExecutor, ForkJoinTask
    • Each worker thread has it’s own task queue (deque) – no concurrency between treads for tasks
    • Work stealing algorithm – threads are never idle
  • 36. Fork/Join - ParallelArray
    • ParallelArray<T>, ParallelLongArray etc.
    • Supports filtering, mapping, searching, sorting, reducing etc.
  • 37. ParallelArray example
    • ParallelArray<Order> orders = new ParallelArray<>(fjPool, data);
    • double maxAmount = orders
    • . withFilter (madeThisYear)
    • . withMapping (getAmount)
    • . max ();
    • static final Ops.Predicate<Order> madeThisYear = new Ops.Predicate<>() {
    • public boolean op(Order o) {
    • return o.getYear() == thisYear;
    • }
    • };
    • static final Ops.ObjectToDouble<Order> getAmount = new Ops.ObjectToDouble<>() {
    • public double op(Order o) {
    • return o.getAmount();
    • }
    • };
  • 38. Try it yourself
    • Download JDK 7 early access https://jdk7.dev.java.net/
  • 39. Questions