{"id":25097,"date":"2014-05-02T11:36:41","date_gmt":"2014-05-02T08:36:41","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=25097"},"modified":"2023-12-05T15:24:17","modified_gmt":"2023-12-05T13:24:17","slug":"java-8-features-tutorial","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html","title":{"rendered":"Java 8 Features Tutorial &#8211; The ULTIMATE Guide (PDF Download &#038; video)"},"content":{"rendered":"<p><em><strong>EDITORIAL NOTE:<\/strong> In this post, we feature a comprehensive Java 8 Features Tutorial.&nbsp; It&#8217;s been a while since Java 8 is out in the public and everything points to the fact that this is a really major release.<\/em><\/p>\n<p><em>We have provided an abundance of tutorials here at Java Code Geeks, like <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/playing-with-java-8-lambdas-and-concurrency.html\">Playing with Java 8 &#8211; Lambdas and Concurrency<\/a>, <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/java-8-date-time-api-tutorial-localdatetime.html\">Java 8 Date Time API Tutorial : LocalDateTime<\/a> and <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/abstract-class-versus-interface-in-the-jdk-8-era.html\">Abstract Class Versus Interface in the JDK 8 Era<\/a>.<\/em><\/p>\n<p><em>We also referenced <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/15-must-read-java-8-tutorials.html\">15 Must Read Java 8 Tutorials<\/a> from other sources. Of course, we examined some of the shortfalls also, like <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/java-8-friday-the-dark-side-of-java-8.html\">The Dark Side of Java 8<\/a>.<\/em><\/p>\n<p>You can also check this tutorial in the following video:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.youtube.com\/watch?v=G9JXMRZqmMg\"><img decoding=\"async\" src=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/07\/Java-8-Features-1024x576.jpg\" alt=\"\" class=\"wp-image-114380\" width=\"512\" height=\"288\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/07\/Java-8-Features-1024x576.jpg 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/07\/Java-8-Features-300x169.jpg 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/07\/Java-8-Features-768x432.jpg 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/07\/Java-8-Features.jpg 1280w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><figcaption>Java 8 Features Tutorial &#8211; video<\/figcaption><\/figure>\n<\/div>\n<p><em>Now, it is time to gather all the major Java 8 features under one reference post for your reading pleasure. Enjoy!<\/em><\/p>\n<div class=\"toc\">\n<h3>Table Of Contents<\/h3>\n<dl>\n<dt><a href=\"#introduction\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#new_features\">2. New Features in Java language<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#lambdas_and_functional\">2.1. Lambdas and Functional Interfaces<\/a><\/dt>\n<dt><a href=\"#Interface_Default\">2.2. Interface Default and Static Methods<\/a><\/dt>\n<dt><a href=\"#method_references\">2.3. Method References<\/a><\/dt>\n<dt><a href=\"#repeating_annotations\">2.4. Repeating annotations<\/a><\/dt>\n<dt><a href=\"#better_type_inference\">2.5. Better Type Inference<\/a><\/dt>\n<dt><a href=\"#extended_annotations_support\">2.6. Extended Annotations Support<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#new_features_in_java\">3. New Features in Java compiler<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#parameter_names\">3.1. Parameter names<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#New Features in Java libraries\">4. New Features in Java libraries<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#Optional\">4.1. Optional<\/a><\/dt>\n<dt><a href=\"#streams\">4.2. Streams<\/a><\/dt>\n<dt><a href=\"#date\/Time_API_(JSR 310)\">4.3. Date\/Time API (JSR 310)<\/a><\/dt>\n<dt><a href=\"#nashorn_JavaScript_engine\">4.4. Nashorn JavaScript engine<\/a><\/dt>\n<dt><a href=\"#base64\">4.5. Base64<\/a><\/dt>\n<dt><a href=\"#parallel_arrays\">4.6. Parallel Arrays<\/a><\/dt>\n<dt><a href=\"#concurrency\">4.7. Concurrency<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#new_java_tools\">5. New Java tools<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#nashorn_engine: jjs\">5.1. Nashorn engine: jjs<\/a><\/dt>\n<dt><a href=\"#class_dependency_analyzer: jdeps\">5.2. Class dependency analyzer: jdeps<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#new_features_in_Java_runtime_(JVM)\">6. New Features in Java runtime (JVM)<\/a><\/dt>\n<dt><a href=\"#conclusions\">7. Conclusions<\/a><\/dt>\n<dt><a href=\"#Resources\">8. Resources<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2 class=\"wp-block-heading\"><a name=\"introduction\"><\/a>1. Introduction<\/h2>\n<p>With no doubts, <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/8train-relnotes-latest-2153846.html\">Java 8 release<\/a> is the greatest thing in the Java world since Java 5 (released quite a while ago, back in 2004). It brings tons of new features to the Java as a language, its compiler, libraries, tools and the JVM (Java virtual machine) itself. In this tutorial we are going to take a look on all these changes and demonstrate the different usage scenarios on real examples.<\/p>\n<p>The tutorial consists of several parts where each one touches the specific side of the platform:<\/p>\n<ul class=\"wp-block-list\">\n<li>language<\/li>\n<li>compiler<\/li>\n<li>libraries<\/li>\n<li>tools<\/li>\n<li>runtime (JVM)<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\"><a name=\"new_features\"><\/a>2. New Features in Java language<\/h2>\n<p>Java 8 is by any means a major release. One might say it took so long to finalize in order to implement the features every Java developer was looking for. In this section we are going to cover most of them.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"lambdas_and_functional\"><\/a>2.1. Lambdas and Functional Interfaces<\/h3>\n<p>Lambdas (also known as closures) are the biggest and most awaited language change in the whole Java 8 release. They allow us to treat functionality as a method argument (passing functions around), or treat a code as data: the concepts every <a href=\"http:\/\/www.javacodegeeks.com\/2014\/03\/functional-programming-with-java-8-lambda-expressions-monads.html\">functional developer<\/a> is very familiar with. Many languages on JVM platform (Groovy, <a href=\"http:\/\/www.javacodegeeks.com\/tutorials\/scala-tutorials\/\">Scala<\/a>, \u2026) have had lambdas since day one, but Java developers had no choice but hammer the lambdas with boilerplate anonymous classes.<\/p>\n<p>Lambdas design discussions have taken a lot of time and community efforts. But finally, the trade-offs have been found, leading to new concise and compact language constructs. In its simplest form, a lambda could be represented as a comma-separated list of parameters, the <strong>\u2013&gt;<\/strong> symbol and the body. For example:<\/p>\n<div>\n<div id=\"highlighter_107537\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).forEach( e -&gt; System.out.println( e ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Please notice the type of argument <strong>e<\/strong> is being inferred by the compiler. Alternatively, you may explicitly provide the type of the parameter, wrapping the definition in brackets. For example:<\/p>\n<div>\n<div id=\"highlighter_565707\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).forEach( ( String e ) -&gt; System.out.println( e ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>In case lambda\u2019s body is more complex, it may be wrapped into square brackets, as the usual function definition in Java. For example:<\/p>\n<div>\n<div id=\"highlighter_547162\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).forEach( e -&gt; {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.print( e );<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.print( e );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">} );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Lambdas may reference the class members and local variables (implicitly making them effectively <strong>final <\/strong>if they are not). For example, those two snippets are equivalent:<\/p>\n<div>\n<div id=\"highlighter_163417\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">String separator = <\/code><code class=\"java string\">\",\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).forEach( <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">( String e ) -&gt; System.out.print( e + separator ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And:<\/p>\n<div>\n<div id=\"highlighter_822137\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">String separator = <\/code><code class=\"java string\">\",\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).forEach( <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">( String e ) -&gt; System.out.print( e + separator ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Lambdas may return a value. The type of the return value will be inferred by compiler. The <strong>return<\/strong> statement is not required if the lambda body is just a one-liner. The two code snippets below are equivalent:<\/p>\n<div>\n<div id=\"highlighter_589258\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).sort( ( e1, e2 ) -&gt; e1.compareTo( e2 ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And:<\/p>\n<div>\n<div id=\"highlighter_500392\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Arrays.asList( <\/code><code class=\"java string\">\"a\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"b\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"d\"<\/code> <code class=\"java plain\">).sort( ( e1, e2 ) -&gt; {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">int<\/code> <code class=\"java plain\">result = e1.compareTo( e2 );<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">result;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">} );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Language designers put a lot of thought on how to make already existing functionality lambda-friendly. As a result, the concept of <a href=\"http:\/\/www.javacodegeeks.com\/2013\/03\/introduction-to-functional-interfaces-a-concept-recreated-in-java-8.html\">functional interfaces<\/a> has emerged. The function interface is an interface with just one single method. As such, it may be implicitly converted to a lambda expression. The <strong>java.lang.Runnable<\/strong> and <strong>java.util.concurrent.Callable<\/strong> are two great examples of functional interfaces. In practice, the functional interfaces are fragile: if someone adds just one another method to the interface definition, it will not be functional anymore and compilation process will fail. To overcome this fragility and explicitly declare the intent of the interface as being functional, Java 8 adds special annotation @FunctionalInterface (all existing interfaces in Java library have been annotated with @FunctionalInterface as well). Let us take a look on this simple functional interface definition:<\/p>\n<div>\n<div id=\"highlighter_297375\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@FunctionalInterface<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">Functional {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">method();<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>One thing to keep in mind: <a href=\"#Interface_Default\">default and static methods<\/a> do not break the functional interface contract and may be declared:<\/p>\n<div>\n<div id=\"highlighter_61813\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@FunctionalInterface<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">FunctionalDefaultMethods {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">method();<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">default<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">defaultMethod() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Lambdas are the largest selling point of Java 8. It has all the potential to attract more and more developers to this great platform and provide state of the art support for functional programming concepts in pure Java. For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/lambdaexpressions.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"Interface_Default\"><\/a>2.2. Interface\u2019s Default and Static Methods<\/h3>\n<p>Java 8 extends interface declarations with two new concepts: default and static methods. <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/java-8-default-methods-what-can-and-can-not-do.html\">Default methods<\/a> make interfaces somewhat similar to traits but serve a bit different goal. They allow adding new methods to existing interfaces without breaking the binary compatibility with the code written for older versions of those interfaces.<\/p>\n<p>The difference between default methods and abstract methods is that abstract methods are required to be implemented. But default methods are not. Instead, each interface must provide so called default implementation and all the implementers will inherit it by default (with a possibility to override this default implementation if needed). Let us take a look on example below.<\/p>\n<div>\n<div id=\"highlighter_795322\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">Defaulable {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java comments\">\/\/ Interfaces now allow default methods, the implementer may or <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java comments\">\/\/ may not implement (override) them.<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">default<\/code> <code class=\"java plain\">String notRequired() { <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java string\">\"Default implementation\"<\/code><code class=\"java plain\">; <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">DefaultableImpl <\/code><code class=\"java keyword\">implements<\/code> <code class=\"java plain\">Defaulable {<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">OverridableImpl <\/code><code class=\"java keyword\">implements<\/code> <code class=\"java plain\">Defaulable {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Override<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">String notRequired() {<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java string\">\"Overridden implementation\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The interface <strong>Defaulable<\/strong> declares a default method <strong>notRequired() <\/strong>using keyword <strong>default<\/strong> as part of the method definition. One of the classes, <strong>DefaultableImpl<\/strong>, implements this interface leaving the default method implementation as-is. Another one, <strong>OverridableImpl<\/strong> , overrides the default implementation and provides its own.<\/p>\n<p>Another interesting feature delivered by Java 8 is that interfaces can declare (and provide implementation) of static methods. Here is an example.<\/p>\n<div>\n<div id=\"highlighter_458829\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">DefaulableFactory {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java comments\">\/\/ Interfaces now allow static methods<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">static<\/code> <code class=\"java plain\">Defaulable create( Supplier&lt; Defaulable &gt; supplier ) {<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">supplier.get();<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The small code snippet below glues together the default methods and static methods from the examples above.<\/p>\n<div>\n<div id=\"highlighter_990469\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main( String[] args ) {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( defaulable.notRequired() );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">defaulable = DefaulableFactory.create( OverridableImpl::<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( defaulable.notRequired() );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The console output of this program looks like that:<\/p>\n<div>\n<div id=\"highlighter_480923\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Default implementation<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Overridden implementation<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Default methods implementation on JVM is very efficient and is supported by the byte code instructions for method invocation. Default methods allowed existing Java interfaces to evolve without breaking the compilation process. The good examples are the plethora of methods added to <strong>java.util.Collection<\/strong> interface: <strong>stream()<\/strong>, <strong>parallelStream()<\/strong>, <strong>forEach()<\/strong>, <strong>removeIf()<\/strong>, \u2026<\/p>\n<p>Though being powerful, default methods should be used with a caution: before declaring method as default it is better to think twice if it is really needed as it may cause ambiguity and compilation errors in complex hierarchies. For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/java\/IandI\/defaultmethods.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"method_references\"><\/a>2.3. Method References<\/h3>\n<p>Method references provide the useful syntax to refer directly to exiting methods or constructors of Java classes or objects (instances). With conjunction of <a href=\"#lambdas_and_functional\">Lambdas<\/a> expressions, method references make the language constructs look compact and concise, leaving off boilerplate.<\/p>\n<p>Below, considering the class <strong>Car <\/strong>as an example of different method definitions, let us distinguish four supported types of method references.<\/p>\n<div>\n<div id=\"highlighter_218869\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Car {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java plain\">Car create( <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Supplier&lt; Car &gt; supplier ) {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">supplier.get();<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">collide( <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Car car ) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Collided \"<\/code> <code class=\"java plain\">+ car.toString() );<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">follow( <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Car another ) {<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Following the \"<\/code> <code class=\"java plain\">+ another.toString() );<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">repair() {&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Repaired \"<\/code> <code class=\"java plain\">+ <\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.toString() );<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The first type of method references is constructor reference with the syntax <strong>Class::new<\/strong> or alternatively, for generics, <strong>Class&lt; T &gt;::new<\/strong>. Please notice that the constructor has no arguments.<\/p>\n<div>\n<div id=\"highlighter_11835\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Car car = Car.create( Car::<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">List&lt; Car &gt; cars = Arrays.asList( car );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The second type is reference to static method with the syntax <strong>Class::static_method<\/strong>. Please notice that the method accepts exactly one parameter of type <strong>Car<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_104153\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">cars.forEach( Car::collide );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The third type is reference to instance method of arbitrary object of specific type with the syntax <strong>Class::method<\/strong>. Please notice, no arguments are accepted by the method.<\/p>\n<div>\n<div id=\"highlighter_103891\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">cars.forEach( Car::repair );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And the last, fourth type is reference to instance method of particular class instance the syntax <strong>instance::method<\/strong>. Please notice that method accepts exactly one parameter of type <strong>Car<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_870310\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Car police = Car.create( Car::<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">cars.forEach( police::follow );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Running all those examples as a Java program produces following output on a console (the actual <strong>Car<\/strong> instances might be different):<\/p>\n<div>\n<div id=\"highlighter_590226\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Collided com.javacodegeeks.java8.method.references.MethodReferences$Car<\/code><code class=\"java color1\">@7a81197d<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Repaired com.javacodegeeks.java8.method.references.MethodReferences$Car<\/code><code class=\"java color1\">@7a81197d<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">Following the com.javacodegeeks.java8.method.references.MethodReferences$Car<\/code><code class=\"java color1\">@7a81197d<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For more examples and details on method references, please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/methodreferences.html\">official documentation.<\/a><\/p>\n<h3 class=\"wp-block-heading\"><a name=\"repeating_annotations\"><\/a>2.4. Repeating annotations<\/h3>\n<p>Since Java 5 introduced the <a href=\"http:\/\/www.javacodegeeks.com\/2012\/08\/java-annotations-explored-explained.html\">annotations support<\/a>, this feature became very popular and is very widely used. However, one of the limitations of annotation usage was the fact that the same annotation cannot be declared more than once at the same location. Java 8 breaks this rule and introduced the repeating annotations. It allows the same annotation to be repeated several times in place it is declared.<\/p>\n<p>The repeating annotations should be themselves annotated with @Repeatable annotation. In fact, it is not a language change but more a compiler trick as underneath the technique stays the same. Let us take a look on quick example:<\/p>\n<div>\n<div id=\"highlighter_331009\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.repeatable.annotations;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.ElementType;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.Repeatable;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.Retention;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.RetentionPolicy;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.Target;<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">RepeatingAnnotations {<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Target<\/code><code class=\"java plain\">( ElementType.TYPE )<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Retention<\/code><code class=\"java plain\">( RetentionPolicy.RUNTIME )<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java color2\">@interface<\/code> <code class=\"java plain\">Filters {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Filter[] value();<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Target<\/code><code class=\"java plain\">( ElementType.TYPE )<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Retention<\/code><code class=\"java plain\">( RetentionPolicy.RUNTIME )<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Repeatable<\/code><code class=\"java plain\">( Filters.<\/code><code class=\"java keyword\">class<\/code> <code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java color2\">@interface<\/code> <code class=\"java plain\">Filter {<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">String value();<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">};<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Filter<\/code><code class=\"java plain\">( <\/code><code class=\"java string\">\"filter1\"<\/code> <code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Filter<\/code><code class=\"java plain\">( <\/code><code class=\"java string\">\"filter2\"<\/code> <code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">interface<\/code> <code class=\"java plain\">Filterable {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main(String[] args) {<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code><code class=\"java plain\">( Filter filter: Filterable.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">.getAnnotationsByType( Filter.<\/code><code class=\"java keyword\">class<\/code> <code class=\"java plain\">) ) {<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( filter.value() );<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>As we can see, there is an annotation class <strong>Filter<\/strong> annotated with @Repeatable( Filters.<strong>class<\/strong> ). The <strong>Filters <\/strong>is just a holder of <strong>Filter<\/strong> annotations but Java compiler tries hard to hide its presence from the developers. As such, the interface <strong>Filterable<\/strong> has <strong>Filter<\/strong> annotation defined twice (with no mentions of <strong>Filters<\/strong>).<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Also, the Reflection API provides new method <strong>getAnnotationsByType()<\/strong> to return repeating annotations of some type (please notice that Filterable.<strong>class<\/strong>.getAnnotation( Filters.<strong>class<\/strong> ) will return the instance of <strong>Filters <\/strong>injected by the compiler).<\/p>\n<p>The program output looks like that:<\/p>\n<div>\n<div id=\"highlighter_316804\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">filter1<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">filter2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/java\/annotations\/repeating.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"better_type_inference\"><\/a>2.5. Better Type Inference<\/h3>\n<p>Java 8 compiler has improved a lot on type inference. In many cases the explicit type parameters could be inferred by compiler keeping the code cleaner. Let us take a look on one of the examples.<\/p>\n<div>\n<div id=\"highlighter_748042\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.type.inference;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Value&lt; T &gt; {<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code><code class=\"java plain\">&lt; T &gt; T defaultValue() { <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java keyword\">null<\/code><code class=\"java plain\">; <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">T getOrDefault( T value, T defaultValue ) {<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">( value != <\/code><code class=\"java keyword\">null<\/code> <code class=\"java plain\">) ? value : defaultValue;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And here is the usage of <strong>Value&lt; String &gt;<\/strong> type.<\/p>\n<div>\n<div id=\"highlighter_156780\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.type.inference;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">TypeInference {<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main(String[] args) {<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Value&lt; String &gt; value = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Value&lt;&gt;();<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">value.getOrDefault( <\/code><code class=\"java string\">\"22\"<\/code><code class=\"java plain\">, Value.defaultValue() );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The type parameter of <strong>Value.<em>defaultValue<\/em>()<\/strong>is inferred and is not required to be provided. In Java 7, the same example will not compile and should be rewritten to <strong>Value.&lt; String &gt;<em>defaultValue<\/em>()<\/strong>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"extended_annotations_support\"><\/a>2.6. Extended Annotations Support<\/h3>\n<p>Java 8 extends the context where annotation might be used. Now, it is possible to annotate mostly everything: local variables, generic types, super-classes and implementing interfaces, even the method\u2019s exceptions declaration. Couple of examples are show below.<\/p>\n<div>\n<div id=\"highlighter_17084\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.annotations;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.ElementType;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.Retention;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.RetentionPolicy;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.annotation.Target;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.util.ArrayList;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.util.Collection;<\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Annotations {<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Retention<\/code><code class=\"java plain\">( RetentionPolicy.RUNTIME )<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Target<\/code><code class=\"java plain\">( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java color2\">@interface<\/code> <code class=\"java plain\">NonEmpty {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Holder&lt; <\/code><code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">T &gt; <\/code><code class=\"java keyword\">extends<\/code> <code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">Object {<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">method() <\/code><code class=\"java keyword\">throws<\/code> <code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@SuppressWarnings<\/code><code class=\"java plain\">( <\/code><code class=\"java string\">\"unused\"<\/code> <code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main(String[] args) {<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Holder&lt; String &gt; holder = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">Holder&lt; String &gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">Collection&lt; <\/code><code class=\"java color1\">@NonEmpty<\/code> <code class=\"java plain\">String &gt; strings = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">ArrayList&lt;&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <strong>ElementType.<\/strong><strong><em>TYPE_USE <\/em><\/strong>and <strong>ElementType.<\/strong><strong><em>TYPE_PARAMETER <\/em><\/strong>are two new element types to describe the applicable annotation context. The <strong>Annotation Processing API<\/strong> also underwent some minor changes to recognize those new type annotations in the Java programming language.<\/p>\n<h2 class=\"wp-block-heading\"><a name=\"new_features_in_java\"><\/a>3. New Features in Java compiler<\/h2>\n<h3 class=\"wp-block-heading\"><a name=\"parameter_names\"><\/a>3.1. Parameter names<\/h3>\n<p>Literally for ages Java developers are inventing different ways to preserve <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/constructormethod-parameters-metadata-available-via-reflection-in-jdk-8.html\">method parameter names in Java byte-code<\/a> and make them available at runtime (for example, <a href=\"https:\/\/github.com\/paul-hammant\/paranamer\">Paranamer library<\/a>). And finally, Java 8 bakes this demanding feature into the language (using Reflection API and <strong>Parameter.getName()<\/strong> method) and the byte-code (using new <strong>javac<\/strong> compiler argument <strong>\u2013parameters<\/strong>).<\/p>\n<div>\n<div id=\"highlighter_913397\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.parameter.names;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.reflect.Method;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.lang.reflect.Parameter;<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">ParameterNames {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main(String[] args) <\/code><code class=\"java keyword\">throws<\/code> <code class=\"java plain\">Exception {<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Method method = ParameterNames.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">.getMethod( <\/code><code class=\"java string\">\"main\"<\/code><code class=\"java plain\">, String[].<\/code><code class=\"java keyword\">class<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code><code class=\"java plain\">( <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Parameter parameter: method.getParameters() ) {<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Parameter: \"<\/code> <code class=\"java plain\">+ parameter.getName() );<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>If you compile this class without using <strong>\u2013parameters<\/strong> argument and then run this program, you will see something like that:<\/p>\n<div>\n<div id=\"highlighter_816582\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Parameter: arg0<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>With <strong>\u2013parameters<\/strong> argument passed to the compiler the program output will be different (the actual name of the parameter will be shown):<\/p>\n<div>\n<div id=\"highlighter_811768\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Parameter: args<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For <a href=\"http:\/\/www.javacodegeeks.com\/tag\/apache-maven\/\">experienced Maven users<\/a> the <strong>\u2013parameters<\/strong> argument could be added to the compiler using configuration section of the <strong>maven-compiler-plugin<\/strong>:<\/p>\n<div>\n<div id=\"highlighter_342133\" class=\"syntaxhighlighter  xml\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">plugin<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">groupId<\/code><code class=\"xml plain\">&gt;org.apache.maven.plugins&lt;\/<\/code><code class=\"xml keyword\">groupId<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">artifactId<\/code><code class=\"xml plain\">&gt;maven-compiler-plugin&lt;\/<\/code><code class=\"xml keyword\">artifactId<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">version<\/code><code class=\"xml plain\">&gt;3.1&lt;\/<\/code><code class=\"xml keyword\">version<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">configuration<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">compilerArgument<\/code><code class=\"xml plain\">&gt;-parameters&lt;\/<\/code><code class=\"xml keyword\">compilerArgument<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">source<\/code><code class=\"xml plain\">&gt;1.8&lt;\/<\/code><code class=\"xml keyword\">source<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;<\/code><code class=\"xml keyword\">target<\/code><code class=\"xml plain\">&gt;1.8&lt;\/<\/code><code class=\"xml keyword\">target<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"xml spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"xml plain\">&lt;\/<\/code><code class=\"xml keyword\">configuration<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"xml plain\">&lt;\/<\/code><code class=\"xml keyword\">plugin<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Latest <strong>Eclipse Kepler SR2<\/strong> release with Java 8 (please check out <a href=\"http:\/\/www.eclipse.org\/downloads\/java8\/\">this download instructions<\/a>) support provides useful configuration option to control this compiler setting as the picture below shows.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2014\/05\/01.ECLIPSE-JAVA-COMPILER.png\"><img decoding=\"async\" width=\"300\" height=\"242\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2014\/05\/01.ECLIPSE-JAVA-COMPILER-300x242.png\" alt=\"Java 8 - Configuring Eclipse projects\" class=\"wp-image-25098\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2014\/05\/01.ECLIPSE-JAVA-COMPILER-300x242.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2014\/05\/01.ECLIPSE-JAVA-COMPILER.png 972w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><figcaption>Picture 1. Configuring Eclipse projects to support new Java 8 compiler \u2013parameters argument<\/figcaption><\/figure>\n<\/div>\n<p>Additionally, to verify the availability of parameter names, there is a handy method <strong>isNamePresent()<\/strong> provided by <strong>Parameter <\/strong>class.<\/p>\n<h2 class=\"wp-block-heading\"><a name=\"New Features in Java libraries\"><\/a>4. New Features in Java libraries<\/h2>\n<p>Java 8 adds a lot of new classes and extends existing ones in order to provide better support of modern concurrency, functional programming, date\/time, and many more.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"Optional\"><\/a>4.1. Optional<\/h3>\n<p>The <a href=\"http:\/\/examples.javacodegeeks.com\/java-basics\/exceptions\/java-lang-nullpointerexception-how-to-handle-null-pointer-exception\/\">famous <strong>NullPointerException<\/strong><\/a> is by far the most popular cause of Java application failures. Long time ago the great <a href=\"http:\/\/code.google.com\/p\/guava-libraries\/\">Google Guava<\/a> project introduced the <strong>Optional<\/strong>s as a solution to <strong>NullPointerException<\/strong>s, discouraging codebase pollution with <strong>null<\/strong> checks and encouraging developers to write cleaner code. Inspired by <a href=\"http:\/\/code.google.com\/p\/guava-libraries\/\">Google Guava<\/a>, the <strong>Optional<\/strong> is now a part of Java 8 library.<\/p>\n<p><strong>Optional <\/strong>is just a container: it can hold a <strong>value<\/strong> of some type <strong>T<\/strong> or just be <strong>null<\/strong>. It provides a lot of useful methods so the explicit <strong>null<\/strong> checks have no excuse anymore. Please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/api\/\">official Java 8 documentation<\/a> for more details.<\/p>\n<p>We are going to take a look on two small examples of <strong>Optional<\/strong> usages: with the <strong>nullable<\/strong> value and with the value which does not allow <strong>null<\/strong>s.<\/p>\n<div>\n<div id=\"highlighter_946153\" class=\"syntaxhighlighter  xml\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"xml plain\">Optional&lt; <\/code><code class=\"xml keyword\">String<\/code> <code class=\"xml plain\">&gt; fullName = Optional.ofNullable( null );<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"xml plain\">System.out.println( \"Full Name is set? \" + fullName.isPresent() );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"xml plain\">System.out.println( \"Full Name: \" + fullName.orElseGet( () -&gt; \"[none]\" ) ); <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"xml plain\">System.out.println( fullName.map( s -&gt; \"Hey \" + s + \"!\" ).orElse( \"Hey Stranger!\" ) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <strong>isPresent() <\/strong>method returns <strong>true<\/strong> if this instance of <strong>Optional<\/strong> has non-null value and <strong>false<\/strong> otherwise. The <strong>orElseGet() <\/strong>method provides the fallback mechanism in case <strong>Optional<\/strong> has <strong>null<\/strong> value by accepting the function to generate the default one. The <strong>map()<\/strong> method transforms the current <strong>Optional<\/strong>\u2019s value and returns the new <strong>Optional<\/strong> instance. The <strong>orElse() <\/strong>method is similar to <strong>orElseGet() <\/strong>but instead of function it accepts the default value. Here is the output of this program:<\/p>\n<div>\n<div id=\"highlighter_333654\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Full Name is set? <\/code><code class=\"java keyword\">false<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Full Name: [none]<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">Hey Stranger!<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>[ulp id=&#8217;SmTz1FuguNhdx3EL&#8217;]<br \/>\n&nbsp;<\/p>\n<p>Let us briefly look on another example:<\/p>\n<div>\n<div id=\"highlighter_331006\" class=\"syntaxhighlighter  xml\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"xml plain\">Optional&lt; <\/code><code class=\"xml keyword\">String<\/code> <code class=\"xml plain\">&gt; firstName = Optional.of( \"Tom\" );<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"xml plain\">System.out.println( \"First Name is set? \" + firstName.isPresent() );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"xml plain\">System.out.println( \"First Name: \" + firstName.orElseGet( () -&gt; \"[none]\" ) ); <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"xml plain\">System.out.println( firstName.map( s -&gt; \"Hey \" + s + \"!\" ).orElse( \"Hey Stranger!\" ) );<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"xml plain\">System.out.println();<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And here is the output:<\/p>\n<div>\n<div id=\"highlighter_516008\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">First Name is set? <\/code><code class=\"java keyword\">true<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">First Name: Tom<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">Hey Tom!<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Optional.html\">official documentation.<\/a><\/p>\n<h3 class=\"wp-block-heading\"><a name=\"streams\"><\/a>4.2. Streams<\/h3>\n<p>The newly <a href=\"http:\/\/www.javacodegeeks.com\/2014\/05\/the-effects-of-programming-with-java-8-streams-on-algorithm-performance.html\">added Stream API<\/a> (<strong>java.util.stream<\/strong>) introduces real-world functional-style programming into the Java. This is by far the most comprehensive addition to Java library intended to make Java developers significantly more productive by allowing them to write effective, clean, and concise code.<\/p>\n<p>Stream API makes collections processing greatly simplified (but it is not limited to Java collections only as we will see later). Let us take start off with simple class called Task.<\/p>\n<div>\n<div id=\"highlighter_916151\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Streams&nbsp; {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">enum<\/code> <code class=\"java plain\">Status {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">OPEN, CLOSED<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">};<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Task {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">Status status;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">Integer points;<\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Task( <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Status status, <\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Integer points ) {<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.status = status;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.points = points;<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">Integer getPoints() {<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">points;<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">Status getStatus() {<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">status;<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Override<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java plain\">String toString() {<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">String.format( <\/code><code class=\"java string\">\"[%s, %d]\"<\/code><code class=\"java plain\">, status, points );<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Task has some notion of points (or pseudo-complexity) and can be either <strong><em>OPEN<\/em><\/strong> or <strong><em>CLOSED<\/em><\/strong>. And then let us introduce a small collection of tasks to play with.<\/p>\n<div>\n<div id=\"highlighter_948372\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Collection&lt; Task &gt; tasks = Arrays.asList(<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Task( Status.OPEN, <\/code><code class=\"java value\">5<\/code> <code class=\"java plain\">),<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Task( Status.OPEN, <\/code><code class=\"java value\">13<\/code> <code class=\"java plain\">),<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Task( Status.CLOSED, <\/code><code class=\"java value\">8<\/code> <code class=\"java plain\">) <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The first question we are going to address is how many points in total all <strong><em>OPEN<\/em><\/strong> tasks have? Up to Java 8, the usual solution for it would be some sort of <strong>foreach<\/strong> iteration. But in Java 8 the answers is streams: a sequence of elements supporting sequential and parallel aggregate operations.<\/p>\n<div>\n<div id=\"highlighter_625240\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Calculate total points of all active tasks using sum()<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java keyword\">long<\/code> <code class=\"java plain\">totalPointsOfOpenTasks = tasks<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.filter( task -&gt; task.getStatus() == Status.OPEN )<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.mapToInt( Task::getPoints )<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.sum();<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Total points: \"<\/code> <code class=\"java plain\">+ totalPointsOfOpenTasks );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And the output on the console looks like that:<\/p>\n<div>\n<div id=\"highlighter_484718\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Total points: <\/code><code class=\"java value\">18<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>There are a couple of things going on here. Firstly, the tasks collection is converted to its stream representation. Then, the <strong>filter<\/strong> operation on stream filters out all <strong><em>CLOSED<\/em><\/strong> tasks. On next step, the <strong>mapToInt<\/strong> operation converts the stream of <strong>Task<\/strong>s to the stream of <strong>Integer<\/strong>s using <strong>Task::getPoints<\/strong> method of the each task instance. And lastly, all points are summed up using <strong>sum<\/strong> method, producing the final result.<\/p>\n<p>Before moving on to the next examples, there are some notes to keep in mind about streams (<a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/stream\/package-summary.html#StreamOps\">more details here<\/a>). Stream operations are divided into intermediate and terminal operations.<\/p>\n<p>Intermediate operations return a new stream. They are always lazy, executing an intermediate operation such as <strong>filter<\/strong> does not actually perform any filtering, but instead creates a new stream that, when traversed, contains the elements of the initial stream that match the given predicate<\/p>\n<p>Terminal operations, such as <strong>forEach<\/strong> or <strong>sum<\/strong>, may traverse the stream to produce a result or a side-effect. After the terminal operation is performed, the stream pipeline is considered consumed, and can no longer be used. In almost all cases, terminal operations are eager, completing their traversal of the underlying data source.<\/p>\n<p>Yet another value proposition of the streams is out-of-the box support of parallel processing. Let us take a look on this example, which does sums the points of all the tasks.<\/p>\n<div>\n<div id=\"highlighter_171010\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Calculate total points of all tasks<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java keyword\">double<\/code> <code class=\"java plain\">totalPoints = tasks<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.parallel()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.map( task -&gt; task.getPoints() ) <\/code><code class=\"java comments\">\/\/ or map( Task::getPoints ) <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.reduce( <\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, Integer::sum );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Total points (all tasks): \"<\/code> <code class=\"java plain\">+ totalPoints );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>It is very similar to the first example except the fact that we try to process all the tasks in <strong>parallel<\/strong> and calculate the final result using <strong>reduce<\/strong> method.<\/p>\n<p>Here is the console output:<\/p>\n<div>\n<div id=\"highlighter_394725\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Total points (all tasks): <\/code><code class=\"java value\">26.0<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Often, there is a need to performing a grouping of the collection elements by some criteria. Streams can help with that as well as an example below demonstrates.<\/p>\n<div>\n<div id=\"highlighter_458881\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Group tasks by their status<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Map&lt; Status, List&lt; Task &gt; &gt; map = tasks<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.collect( Collectors.groupingBy( Task::getStatus ) );<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">System.out.println( map );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The console output of this example looks like that:<\/p>\n<div>\n<div id=\"highlighter_493424\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">{CLOSED=[[CLOSED, <\/code><code class=\"java value\">8<\/code><code class=\"java plain\">]], OPEN=[[OPEN, <\/code><code class=\"java value\">5<\/code><code class=\"java plain\">], [OPEN, <\/code><code class=\"java value\">13<\/code><code class=\"java plain\">]]}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To finish up with the tasks example, let us calculate the overall percentage (or weight) of each task across the whole collection, based on its points.<\/p>\n<div>\n<div id=\"highlighter_711421\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Calculate the weight of each tasks (as percent of total points) <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Collection&lt; String &gt; result = tasks<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.stream()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ Stream&lt; String &gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.mapToInt( Task::getPoints )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ IntStream<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.asLongStream()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ LongStream<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.mapToDouble( points -&gt; points \/ totalPoints )&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ DoubleStream<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.boxed()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ Stream&lt; Double &gt;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.mapToLong( weigth -&gt; ( <\/code><code class=\"java keyword\">long<\/code> <code class=\"java plain\">)( weigth * <\/code><code class=\"java value\">100<\/code> <code class=\"java plain\">) ) <\/code><code class=\"java comments\">\/\/ LongStream<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.mapToObj( percentage -&gt; percentage + <\/code><code class=\"java string\">\"%\"<\/code> <code class=\"java plain\">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ Stream&lt; String&gt; <\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.collect( Collectors.toList() );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><code class=\"java comments\">\/\/ List&lt; String &gt; <\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">System.out.println( result );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The console output is just here:<\/p>\n<div>\n<div id=\"highlighter_661764\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><code class=\"java value\">19<\/code><code class=\"java plain\">%, <\/code><code class=\"java value\">50<\/code><code class=\"java plain\">%, <\/code><code class=\"java value\">30<\/code><code class=\"java plain\">%]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And lastly, as we mentioned before, the Stream API is not only about Java collections. The typical I\/O operations like reading the text file line by line is a very good candidate to benefit from stream processing. Here is a small example to confirm that.<\/p>\n<div>\n<div id=\"highlighter_111694\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Path path = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">File( filename ).toPath();<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">try<\/code><code class=\"java plain\">( Stream&lt; String &gt; lines = Files.lines( path, StandardCharsets.UTF_8 ) ) {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">lines.onClose( () -&gt; System.out.println(<\/code><code class=\"java string\">\"Done!\"<\/code><code class=\"java plain\">) ).forEach( System.out::println );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <strong>onClose<\/strong> method called on the stream returns an equivalent stream with an additional close handler. Close handlers are run when the <strong>close()<\/strong> method is called on the stream.<\/p>\n<p>Stream API together with <a href=\"#lambdas_and_functional\">Lambdas<\/a> and <a href=\"#_Method_References\">Method References<\/a> baked by <a href=\"#_Interface\u2019s_Default_and\">Interface\u2019s Default and Static Methods<\/a> is the Java 8 response to the modern paradigms in software development. For more details, please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/collections\/streams\/index.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"date\/Time_API_(JSR 310)\"><\/a>4.3. Date\/Time API (JSR 310)<\/h3>\n<p>Java 8 makes one more take on date and time management by delivering <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=310\">New Date-Time API (JSR 310)<\/a>. Date and time manipulation is being one of the worst pain points for Java developers. The standard <strong>java.util.Date<\/strong> followed by <strong>java.util.Calendar <\/strong>hasn\u2019t improved the situation at all (arguably, made it even more confusing).<\/p>\n<p>That is how <a href=\"http:\/\/www.joda.org\/joda-time\/\">Joda-Time<\/a> was born: the great alternative date\/time API for Java. The Java 8\u2019s <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=310\">New Date-Time API (JSR 310)<\/a> was heavily influenced by <a href=\"http:\/\/www.joda.org\/joda-time\/\">Joda-Time<\/a> and took the best of it. The new <strong>java.time<\/strong> package contains <a href=\"http:\/\/www.javacodegeeks.com\/2014\/03\/whats-new-in-java-8-date-api.html\">all the classes for date, time, date\/time, time zones, instants, duration, and clocks manipulation<\/a>. In the design of the API the immutability has been taken into account very seriously: no change allowed (the tough lesson learnt from<strong> java.util.Calendar<\/strong>). If the modification is required, the new instance of respective class will be returned.<\/p>\n<p>Let us take a look on key classes and examples of their usages. The first class is <strong>Clock<\/strong> which provides access to the current instant, date and time using a time-zone. <strong>Clock<\/strong> can be used instead of <strong>System.currentTimeMillis()<\/strong> and <strong>TimeZone.getDefault()<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_305285\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Get the system clock as UTC offset <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Clock clock = Clock.systemUTC();<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">System.out.println( clock.instant() );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">System.out.println( clock.millis() );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_178204\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T15:<\/code><code class=\"java value\">19<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">29<\/code><code class=\"java plain\">.282Z<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java value\">1397315969360<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Other new classes we are going to look at are <strong>LocaleDate<\/strong> and <strong>LocalTime<\/strong>. <strong>LocaleDate <\/strong>holds only the date part without a time-zone in the ISO-8601 calendar system. Respectively, <strong>LocaleTime <\/strong>holds only the time part without time-zone in the ISO-8601 calendar system. Both <strong>LocaleDate <\/strong>and<strong> LocaleTime <\/strong>could be created from <strong>Clock<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_35154\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Get the local date and local time<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDate date = LocalDate.now();<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDate dateFromClock = LocalDate.now( clock );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">System.out.println( date );<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">System.out.println( dateFromClock );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java comments\">\/\/ Get the local date and local time<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalTime time = LocalTime.now();<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalTime timeFromClock = LocalTime.now( clock );<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">System.out.println( time );<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">System.out.println( timeFromClock );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_181116\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">12<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">12<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java value\">11<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">25<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">54.568<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java value\">15<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">25<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">54.568<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <strong>LocalDateTime<\/strong> combines together <strong>LocaleDate<\/strong> and <strong>LocalTime<\/strong> and holds a date with time but without a time-zone in the ISO-8601 calendar system. A <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/java-8-date-time-api-tutorial-localdatetime.html\">quick example<\/a> is shown below.<\/p>\n<div>\n<div id=\"highlighter_506402\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Get the local date\/time<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDateTime datetime = LocalDateTime.now();<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDateTime datetimeFromClock = LocalDateTime.now( clock );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">System.out.println( datetime );<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">System.out.println( datetimeFromClock );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_77180\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T11:<\/code><code class=\"java value\">37<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">52.309<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T15:<\/code><code class=\"java value\">37<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">52.309<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>If case you need a date\/time for particular timezone, the <strong>ZonedDateTime <\/strong>is here to help. It holds a date with time and with a time-zone in the ISO-8601 calendar system. Here are a couple of examples for different timezones.<\/p>\n<div>\n<div id=\"highlighter_987134\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Get the zoned date\/time<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">ZonedDateTime zonedDatetime = ZonedDateTime.now();<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock );<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( <\/code><code class=\"java string\">\"America\/Los_Angeles\"<\/code> <code class=\"java plain\">) );<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">System.out.println( zonedDatetime );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">System.out.println( zonedDatetimeFromClock );<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">System.out.println( zonedDatetimeFromZone );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_216553\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T11:<\/code><code class=\"java value\">47<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">01.017<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">00<\/code><code class=\"java plain\">[America\/New_York]<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T15:<\/code><code class=\"java value\">47<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">01<\/code><code class=\"java plain\">.017Z<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java value\">2014<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">04<\/code><code class=\"java plain\">-12T08:<\/code><code class=\"java value\">47<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">01.017<\/code><code class=\"java plain\">-<\/code><code class=\"java value\">07<\/code><code class=\"java plain\">:<\/code><code class=\"java value\">00<\/code><code class=\"java plain\">[America\/Los_Angeles]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And finally, let us take a look on <strong>Duration<\/strong> class: an amount of time in terms of seconds and nanoseconds. It makes very easy to compute the different between two dates. Let us take a look on that.<\/p>\n<div>\n<div id=\"highlighter_796903\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java comments\">\/\/ Get duration between two dates<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDateTime from = LocalDateTime.of( <\/code><code class=\"java value\">2014<\/code><code class=\"java plain\">, Month.APRIL, <\/code><code class=\"java value\">16<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">0<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">LocalDateTime to = LocalDateTime.of( <\/code><code class=\"java value\">2015<\/code><code class=\"java plain\">, Month.APRIL, <\/code><code class=\"java value\">16<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">23<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">59<\/code><code class=\"java plain\">, <\/code><code class=\"java value\">59<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">final<\/code> <code class=\"java plain\">Duration duration = Duration.between( from, to );<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Duration in days: \"<\/code> <code class=\"java plain\">+ duration.toDays() );<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Duration in hours: \"<\/code> <code class=\"java plain\">+ duration.toHours() );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The example above computes the duration (in days and hours) between two dates, <strong>16 April 2014<\/strong> and <strong>16 April 2015<\/strong>. Here is the sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_730369\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Duration in days: <\/code><code class=\"java value\">365<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Duration in hours: <\/code><code class=\"java value\">8783<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The overall impression about Java 8\u2019s new date\/time API is very, very positive. Partially, because of the battle-proved foundation it is built upon (<a href=\"http:\/\/www.joda.org\/joda-time\/\">Joda-Time<\/a>), partially because this time it was finally tackled seriously and developer voices have been heard. For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/datetime\/index.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"nashorn_JavaScript_engine\"><\/a>4.4. Nashorn JavaScript engine<\/h3>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/2014\/02\/java-8-compiling-lambda-expressions-in-the-new-nashorn-js-engine.html\">Java 8 comes with new Nashorn JavaScript engine<\/a> which allows developing and running certain kinds of JavaScript applications on JVM. Nashorn JavaScript engine is just another implementation of javax.script.ScriptEngine and follows the same set of rules, permitting Java and JavaScript interoperability. Here is a small example.<\/p>\n<div>\n<div id=\"highlighter_5610\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">ScriptEngineManager manager = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">ScriptEngineManager();<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">ScriptEngine engine = manager.getEngineByName( <\/code><code class=\"java string\">\"JavaScript\"<\/code> <code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">System.out.println( engine.getClass().getName() );<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">System.out.println( <\/code><code class=\"java string\">\"Result:\"<\/code> <code class=\"java plain\">+ engine.eval( <\/code><code class=\"java string\">\"function f() { return 1; }; f() + 1;\"<\/code> <code class=\"java plain\">) );<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The sample output on a console:<\/p>\n<div>\n<div id=\"highlighter_629037\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">jdk.nashorn.api.scripting.NashornScriptEngine<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Result: <\/code><code class=\"java value\">2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>We will get back to the Nashorn later in the section <a href=\"#_New_Java_tools\">dedicated to new Java tools<\/a>.<\/p>\n<h2 class=\"wp-block-heading\"><a name=\"base64\"><\/a>4.5. Base64<\/h2>\n<p>Finally, the <a href=\"http:\/\/www.javacodegeeks.com\/2014\/04\/base64-in-java-8-its-not-too-late-to-join-in-the-fun.html\">support of Base64 encoding<\/a> has made its way into Java standard library with Java 8 release. It is very easy to use as following example shows off.<\/p>\n<div>\n<div id=\"highlighter_310404\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.base64;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.nio.charset.StandardCharsets;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.util.Base64;<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">Base64s {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main(String[] args) {<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">String text = <\/code><code class=\"java string\">\"Base64 finally in Java 8!\"<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">String encoded = Base64<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.getEncoder()<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( encoded );<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">final<\/code> <code class=\"java plain\">String decoded = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">String( <\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Base64.getDecoder().decode( encoded ),<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">StandardCharsets.UTF_8 );<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println( decoded );<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The console output from program run shows both encoded and decoded text:<\/p>\n<div>\n<div id=\"highlighter_44737\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ==<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Base64 <\/code><code class=\"java keyword\">finally<\/code> <code class=\"java plain\">in Java <\/code><code class=\"java value\">8<\/code><code class=\"java plain\">!<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>There are also URL-friendly encoder\/decoder and MIME-friendly encoder\/decoder provided by the Base64 class (<strong>Base64.<em>getUrlEncoder<\/em>()<\/strong> \/ <strong>Base64.<em>getUrlDecoder<\/em>()<\/strong>, <strong>Base64.<em>getMimeEncoder<\/em>()<\/strong> \/ <strong>Base64.<em>getMimeDecoder<\/em>()<\/strong>).<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"parallel_arrays\"><\/a>4.6. Parallel Arrays<\/h3>\n<p>Java 8 release adds a lot of new methods to allow parallel arrays processing. Arguably, the most important one is <strong>parallelSort()<\/strong> which may significantly speedup the sorting on multicore machines. The following small example demonstrates this new method family (<strong>parallelXxx<\/strong>) in action.<\/p>\n<div>\n<div id=\"highlighter_567710\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">package<\/code> <code class=\"java plain\">com.javacodegeeks.java8.parallel.arrays;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.util.Arrays;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">import<\/code> <code class=\"java plain\">java.util.concurrent.ThreadLocalRandom;<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">class<\/code> <code class=\"java plain\">ParallelArrays {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">public<\/code> <code class=\"java keyword\">static<\/code> <code class=\"java keyword\">void<\/code> <code class=\"java plain\">main( String[] args ) {<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">long<\/code><code class=\"java plain\">[] arrayOfLong = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java keyword\">long<\/code> <code class=\"java plain\">[ <\/code><code class=\"java value\">20000<\/code> <code class=\"java plain\">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Arrays.parallelSetAll( arrayOfLong, <\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">index -&gt; ThreadLocalRandom.current().nextInt( <\/code><code class=\"java value\">1000000<\/code> <code class=\"java plain\">) );<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Arrays.stream( arrayOfLong ).limit( <\/code><code class=\"java value\">10<\/code> <code class=\"java plain\">).forEach( <\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">i -&gt; System.out.print( i + <\/code><code class=\"java string\">\" \"<\/code> <code class=\"java plain\">) );<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println();<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Arrays.parallelSort( arrayOfLong );&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Arrays.stream( arrayOfLong ).limit( <\/code><code class=\"java value\">10<\/code> <code class=\"java plain\">).forEach( <\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">i -&gt; System.out.print( i + <\/code><code class=\"java string\">\" \"<\/code> <code class=\"java plain\">) );<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">System.out.println();<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This small code snippet uses method <strong><em>parallelSetAll()<\/em><\/strong> to fill up arrays with 20000 random values. After that, the <strong><em>parallelSort()<\/em><\/strong> is being applied. The program outputs first 10 elements before and after sorting so to ensure the array is really ordered. The sample program output may look like that (please notice that array elements are randomly generated):<\/p>\n<div>\n<div id=\"highlighter_510144\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">Unsorted: <\/code><code class=\"java value\">591217<\/code> <code class=\"java value\">891976<\/code> <code class=\"java value\">443951<\/code> <code class=\"java value\">424479<\/code> <code class=\"java value\">766825<\/code> <code class=\"java value\">351964<\/code> <code class=\"java value\">242997<\/code> <code class=\"java value\">642839<\/code> <code class=\"java value\">119108<\/code> <code class=\"java value\">552378<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Sorted: <\/code><code class=\"java value\">39<\/code> <code class=\"java value\">220<\/code> <code class=\"java value\">263<\/code> <code class=\"java value\">268<\/code> <code class=\"java value\">325<\/code> <code class=\"java value\">607<\/code> <code class=\"java value\">655<\/code> <code class=\"java value\">678<\/code> <code class=\"java value\">723<\/code> <code class=\"java value\">793<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3 class=\"wp-block-heading\"><a name=\"concurrency\"><\/a>4.7. Concurrency<\/h3>\n<p>New methods have been added to the <strong>java.util.concurrent.ConcurrentHashMap<\/strong> class to support aggregate operations based on the newly added streams facility and lambda expressions. Also, new methods have been added to the <strong>java.util.concurrent.ForkJoinPool<\/strong> class to support a common pool (check also our <a href=\"http:\/\/academy.javacodegeeks.com\/course\/java-concurrency-essentials\/\">free course on Java concurrency<\/a>).<\/p>\n<p>The new <strong>java.util.concurrent.locks.StampedLock<\/strong> class has been added to provide a capability-based lock with three modes for controlling read\/write access (it might be considered as better alternative for infamous <strong>java.util.concurrent.locks.ReadWriteLock<\/strong>).<\/p>\n<p>New classes have been added to the <strong>java.util.concurrent.atomic <\/strong>package:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>DoubleAccumulator<\/strong><\/li>\n<li><strong>DoubleAdder<\/strong><\/li>\n<li><strong>LongAccumulator<\/strong><\/li>\n<li><strong>LongAdder<\/strong><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\"><a name=\"new_java_tools\"><\/a>5. New Java tools<\/h2>\n<p>Java 8 comes with new set of command line tools. In this section we are going to look over most interesting of them.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"nashorn_engine: jjs\"><\/a>5.1. Nashorn engine: jjs<\/h3>\n<p><strong>jjs<\/strong> is a command line based standalone Nashorn engine. It accepts a list of JavaScript source code files as arguments and runs them. For example, let us create a file <strong>func.js<\/strong> with following content:<\/p>\n<div>\n<div id=\"highlighter_399624\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">function f() { <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java value\">1<\/code><code class=\"java plain\">; <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">}; <\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">print( f() + <\/code><code class=\"java value\">1<\/code> <code class=\"java plain\">);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To execute this fie from command, let us pass it as an argument to <strong>jjs<\/strong>:<\/p>\n<div>\n<div id=\"highlighter_855915\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">jjs func.js<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The output on the console will be:<\/p>\n<div>\n<div id=\"highlighter_685021\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java value\">2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/jjs.html\">official documentation<\/a>.<\/p>\n<h3 class=\"wp-block-heading\"><a name=\"class_dependency_analyzer: jdeps\"><\/a>5.2. Class dependency analyzer: jdeps<\/h3>\n<p><strong>jdeps<\/strong> is a really great command line tool. It shows the package-level or class-level dependencies of Java class files. It accepts <strong>.class<\/strong> file, <strong>a directory<\/strong>, or<strong> JAR file<\/strong> as an input. By default, <strong>jdeps<\/strong> outputs the dependencies to the system output (console).<\/p>\n<p>As an example, let us take a look on dependencies report for the popular <a href=\"http:\/\/projects.spring.io\/spring-framework\/\">Spring Framework<\/a> library. To make example short, let us analyze only one JAR file: <strong>org.springframework.core-3.0.5.RELEASE.jar<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_399677\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">jdeps org.springframework.core-<\/code><code class=\"java value\">3.0<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">5<\/code><code class=\"java plain\">.RELEASE.jar<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This command outputs quite a lot so we are going to look on the part of it. The dependencies are grouped by packages. If dependency is not available on a classpath, it is shown as <strong>not found<\/strong>.<\/p>\n<div>\n<div id=\"highlighter_569717\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">org.springframework.core-<\/code><code class=\"java value\">3.0<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">5<\/code><code class=\"java plain\">.RELEASE.jar -&gt; C:\\Program Files\\Java\\jdk1.<\/code><code class=\"java value\">8.0<\/code><code class=\"java plain\">\\jre\\lib\\rt.jar<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">org.springframework.core (org.springframework.core-<\/code><code class=\"java value\">3.0<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">5<\/code><code class=\"java plain\">.RELEASE.jar)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.io&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang.annotation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang.ref&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang.reflect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.util&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.util.concurrent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; org.apache.commons.logging&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not found<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; org.springframework.asm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not found<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; org.springframework.asm.commons&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not found<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">org.springframework.core.annotation (org.springframework.core-<\/code><code class=\"java value\">3.0<\/code><code class=\"java plain\">.<\/code><code class=\"java value\">5<\/code><code class=\"java plain\">.RELEASE.jar)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang.annotation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.lang.reflect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">-&gt; java.util<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>For more details please refer to <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/jdeps.html\">official documentation<\/a>.<\/p>\n<h2 class=\"wp-block-heading\"><a name=\"new_features_in_Java_runtime_(JVM)\"><\/a>6. New Features in Java runtime (JVM)<\/h2>\n<p>The <strong>PermGen<\/strong> space <a href=\"http:\/\/www.javacodegeeks.com\/2013\/02\/java-8-from-permgen-to-metaspace.html\">is gone and has been replaced with Metaspace<\/a> (<a href=\"http:\/\/openjdk.java.net\/jeps\/122\">JEP 122<\/a>). The JVM options <strong>-XX:PermSize<\/strong> and &#8211;<strong>XX:MaxPermSize<\/strong> have been replaced by <strong>-XX:MetaSpaceSize<\/strong> and <strong>-XX:MaxMetaspaceSize<\/strong> respectively.<\/p>\n<h2 class=\"wp-block-heading\"><a name=\"conclusions\"><\/a>7. Conclusions<\/h2>\n<p>The future is here: Java 8 moves this great platform forward by delivering the features to make developers much more productive. It is too early to move the production systems to Java 8 but in the next couples of months its adoption should slowly start growing. Nevertheless the time is right to start preparing your code bases to be compatible with Java 8 and to be ready to turn the switch once Java 8 proves to be safe and stable enough.<\/p>\n<p>Now, you can <a href=\"https:\/\/examples.javacodegeeks.com\/download-and-install-java-development-kit-jdk-8\/\">Download and Install Java Development Kit (JDK) 8<\/a>.<\/p>\n<p>As a confirmation of community Java 8 acceptance, recently Pivotal released <a href=\"https:\/\/spring.io\/blog\/2014\/03\/27\/spring-framework-4-0-3-released-with-java-8-support-now-production-ready\">Spring Framework 4.0.3 with production-ready Java 8 support<\/a>.<\/p>\n<p>If you enjoyed this, then <strong><a href=\"http:\/\/eepurl.com\/xRlkj\">subscribe to our newsletter<\/a><\/strong> to enjoy weekly updates and complimentary whitepapers! Also, check out our <a href=\"https:\/\/www.javacodegeeks.com\/courses\/\"><strong>courses<\/strong><\/a> for more advanced training!<\/p>\n<p><em>You are welcome to contribute with your comments about the exciting new Java 8 features!<\/em><\/p>\n<h2 class=\"wp-block-heading\"><a name=\"Resources\"><\/a>8. Resources<\/h2>\n<p>Some additional resources which discuss in depth different aspects of Java 8 features:<\/p>\n<ul class=\"wp-block-list\">\n<li>Java 8 Tutorials on JCG Examples: <a href=\"https:\/\/examples.javacodegeeks.com\/?s=java+8\">https:\/\/examples.javacodegeeks.com\/?s=java+8<\/a><\/li>\n<li>What&#8217;s New in JDK 8: <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/8-whats-new-2157071.html\">http:\/\/www.oracle.com\/technetwork\/java\/javase\/8-whats-new-2157071.html<\/a><\/li>\n<li>The Java Tutorials: <a href=\"http:\/\/docs.oracle.com\/javase\/tutorial\/\">http:\/\/docs.oracle.com\/javase\/tutorial\/<\/a><\/li>\n<li>WildFly 8, JDK 8, NetBeans 8, Java EE 7: <a href=\"http:\/\/blog.arungupta.me\/2014\/03\/wildfly8-jdk8-netbeans8-javaee7-excellent-combo-enterprise-java\/\">http:\/\/blog.arungupta.me\/2014\/03\/wildfly8-jdk8-netbeans8-javaee7-excellent-combo-enterprise-java\/<\/a><\/li>\n<li>Java 8 Tutorial: <a href=\"http:\/\/winterbe.com\/posts\/2014\/03\/16\/java-8-tutorial\/\">http:\/\/winterbe.com\/posts\/2014\/03\/16\/java-8-tutorial\/<\/a><\/li>\n<li>JDK 8 Command-line Static Dependency Checker: <a href=\"http:\/\/marxsoftware.blogspot.ca\/2014\/03\/jdeps.html\">http:\/\/marxsoftware.blogspot.ca\/2014\/03\/jdeps.html<\/a><\/li>\n<li>The Illuminating Javadoc of JDK 8: <a href=\"http:\/\/marxsoftware.blogspot.ca\/2014\/03\/illuminating-javadoc-of-jdk-8.html\">http:\/\/marxsoftware.blogspot.ca\/2014\/03\/illuminating-javadoc-of-jdk-8.html<\/a><\/li>\n<li>The Dark Side of Java 8: <a href=\"http:\/\/blog.jooq.org\/2014\/04\/04\/java-8-friday-the-dark-side-of-java-8\/\">http:\/\/blog.jooq.org\/2014\/04\/04\/java-8-friday-the-dark-side-of-java-8\/<\/a><\/li>\n<li>Installing Java\u2122 8 Support in Eclipse Kepler SR2: <a href=\"http:\/\/www.eclipse.org\/downloads\/java8\/\">http:\/\/www.eclipse.org\/downloads\/java8\/<\/a><\/li>\n<li>Java 8: <a href=\"http:\/\/www.baeldung.com\/java8\">http:\/\/www.baeldung.com\/java8<\/a><\/li>\n<li>Oracle Nashorn. A Next-Generation JavaScript Engine for the JVM: <a href=\"http:\/\/www.oracle.com\/technetwork\/articles\/java\/jf14-nashorn-2126515.html\">http:\/\/www.oracle.com\/technetwork\/articles\/java\/jf14-nashorn-2126515.html<\/a><\/li>\n<\/ul>\n<p><strong>Last updated on Feb. 24th, 2022<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>EDITORIAL NOTE: In this post, we feature a comprehensive Java 8 Features Tutorial.&nbsp; It&#8217;s been a while since Java 8 is out in the public and everything points to the fact that this is a really major release. We have provided an abundance of tutorials here at Java Code Geeks, like Playing with Java 8 &hellip;<\/p>\n","protected":false},"author":141,"featured_media":148,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[196,197,1039],"class_list":["post-25097","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-core-java","tag-java-8","tag-lambdas","tag-ultimate"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-02T08:36:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-05T13:24:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andrey Redko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrey Redko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html\"},\"author\":{\"name\":\"Andrey Redko\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\"},\"headline\":\"Java 8 Features Tutorial &#8211; The ULTIMATE Guide (PDF Download &#038; video)\",\"datePublished\":\"2014-05-02T08:36:41+00:00\",\"dateModified\":\"2023-12-05T13:24:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html\"},\"wordCount\":4049,\"commentCount\":58,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"keywords\":[\"Java 8\",\"Lambdas\",\"Ultimate\"],\"articleSection\":[\"Core Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html\",\"name\":\"Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"datePublished\":\"2014-05-02T08:36:41+00:00\",\"dateModified\":\"2023-12-05T13:24:17+00:00\",\"description\":\"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/java-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/java-8-features-tutorial.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Core Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/core-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Java 8 Features Tutorial &#8211; The ULTIMATE Guide (PDF Download &#038; video)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\",\"name\":\"Andrey Redko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"caption\":\"Andrey Redko\"},\"description\":\"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\\\/EE, C#\\\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).\",\"sameAs\":[\"http:\\\/\\\/aredko.blogspot.com\\\/\",\"http:\\\/\\\/ca.linkedin.com\\\/in\\\/aredko\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/andrey-redko\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026","description":"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html","og_locale":"en_US","og_type":"article","og_title":"Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026","og_description":"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!","og_url":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2014-05-02T08:36:41+00:00","article_modified_time":"2023-12-05T13:24:17+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","type":"image\/jpeg"}],"author":"Andrey Redko","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Andrey Redko","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html"},"author":{"name":"Andrey Redko","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413"},"headline":"Java 8 Features Tutorial &#8211; The ULTIMATE Guide (PDF Download &#038; video)","datePublished":"2014-05-02T08:36:41+00:00","dateModified":"2023-12-05T13:24:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html"},"wordCount":4049,"commentCount":58,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","keywords":["Java 8","Lambdas","Ultimate"],"articleSection":["Core Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html","url":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html","name":"Java 8 Features - The ULTIMATE Guide - Java Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","datePublished":"2014-05-02T08:36:41+00:00","dateModified":"2023-12-05T13:24:17+00:00","description":"Check out our detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Features Ultimate Guide!","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/java-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/java-8-features-tutorial.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Core Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/core-java"},{"@type":"ListItem","position":4,"name":"Java 8 Features Tutorial &#8211; The ULTIMATE Guide (PDF Download &#038; video)"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413","name":"Andrey Redko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","caption":"Andrey Redko"},"description":"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\/EE, C#\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).","sameAs":["http:\/\/aredko.blogspot.com\/","http:\/\/ca.linkedin.com\/in\/aredko"],"url":"https:\/\/www.javacodegeeks.com\/author\/andrey-redko"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/25097","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/141"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=25097"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/25097\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/148"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=25097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=25097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=25097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}