加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8 Features – The ULTIMATE Guide--reference

发布时间:2020-12-14 06:19:11 所属栏目:Java 来源:网络整理
导读:Now,it is time to gather all the major Java 8 features under one reference post for your reading pleasure. Enjoy! Table Of Contents 1. Introduction With no doubts,??is the greatest thing in the Java world since Java 5 (released quite a whi

Now,it is time to gather all the major Java 8 features under one reference post for your reading pleasure. Enjoy!

Table Of Contents

1. Introduction

With no doubts,??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.

The tutorial consists of several parts where each one touches the specific side of the platform:

  • language
  • compiler
  • libraries
  • tools
  • runtime (JVM)

2. New Features in Java language

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.

2.1. Lambdas and Functional Interfaces

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??is very familiar with. Many languages on JVM platform (Groovy,?,…) have had lambdas since day one,but Java developers had no choice but hammer the lambdas with boilerplate anonymous classes.

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?–>?symbol and the body. For example:

1? System.out.println( e ) );

Please notice the type of argument?e?is being inferred by the compiler. Alternatively,you may explicitly provide the type of the parameter,wrapping the definition in brackets. For example:

1? System.out.println( e ) );

In case lambda’s body is more complex,it may be wrapped into square brackets,as the usual function definition in Java. For example:

1? {
2
3
4

Lambdas may reference the class members and local variables (implicitly making them effectively?final?if they are not). For example,those two snippets are equivalent:

1
2?
3 System.out.print( e + separator ) );

And:

1??
3 System.out.print( e + separator ) );

Lambdas may return a value. The type of the return value will be inferred by compiler. The?return?statement is not required if the lambda body is just a one-liner. The two code snippets below are equivalent:

1? e1.compareTo( e2 ) );

And:

1 {
2?
3?
4

Language designers put a lot of thought on how to make already existing functionality lambda-friendly. As a result,the concept of?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?java.lang.Runnable?and?java.util.concurrent.Callable?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:

1
2??
3?
4

One thing to keep in mind:??do not break the functional interface contract and may be declared:

1
2??
3?
4?
5??
6
7

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?.

2.2. Interface’s Default and Static Methods

Java 8 extends interface declarations with two new concepts: default and static methods.??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.

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.

01??
02
03
04?
05?
06
07
08?
09????
10
11?
12????
13
14?
15?
16
17

The interface?Defaulable?declares a default method?notRequired()?using keyword?default?as part of the method definition. One of the classes,?DefaultableImpl,implements this interface leaving the default method implementation as-is. Another one,?OverridableImpl?,overrides the default implementation and provides its own.

Another interesting feature delivered by Java 8 is that interfaces can declare (and provide implementation) of static methods. Here is an example.

1??
2
3? supplier ) {
4?
5
6

The small code snippet below glues together the default methods and static methods from the examples above.

1???
2?
3
4?
5?
6
7

The console output of this program looks like that:

1
2

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?java.util.Collection?interface:?stream(),?parallelStream(),?forEach(),?removeIf(),…

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?.

2.3. Method References

Method references provide the useful syntax to refer directly to exiting methods or constructors of Java classes or objects (instances). With conjunction of??expressions,method references make the language constructs look compact and concise,leaving off boilerplate.

Below,considering the class?Car?as an example of different method definitions,let us distinguish four supported types of method references.

01???
02??? supplier ) {
03?
04
05?
06????
07?
08
09?
10???
11?
12
13?
14??
15?
16
17

The first type of method references is constructor reference with the syntax?Class::new?or alternatively,for generics,?Class< T >::new. Please notice that the constructor has no arguments.

1??
2? cars = Arrays.asList( car );

The second type is reference to static method with the syntax?Class::static_method. Please notice that the method accepts exactly one parameter of type?Car.

1

The third type is reference to instance method of arbitrary object of specific type with the syntax?Class::method. Please notice,no arguments are accepted by the method.

1

And the last,fourth type is reference to instance method of particular class instance the syntax?instance::method. Please notice that method accepts exactly one parameter of type?Car.

1??
2

Running all those examples as a Java program produces following output on a console (the actual?Car?instances might be different):

1
2
3

For more examples and details on method references,please refer to?

2.4. Repeating annotations

Since Java 5 introduced the?,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.

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:

01?
02
03?
04?
05?
06?
07?
08
09??
10
11
12??
13
14
15?
16
17
18?
19??
20
21
22?
23?
24?
25??
26
27?
28???
29?
30
31
32
33

As we can see,there is an annotation class?Filter?annotated with @Repeatable( Filters.class?). The?Filters?is just a holder of?Filterannotations but Java compiler tries hard to hide its presence from the developers. As such,the interface?Filterable?has?Filterannotation defined twice (with no mentions of?Filters).

Also,the Reflection API provides new method?getAnnotationsByType()?to return repeating annotations of some type (please notice that Filterable.class.getAnnotation( Filters.class?) will return the instance of?Filters?injected by the compiler).

The program output looks like that:

1
2

For more details please refer to?.

2.5. Better Type Inference

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.

01?
02
03?? {
04? T defaultValue() {
05?
06
07?
08?
09??
10
11

And here is the usage of?Value< String >?type.

1?
2
3??
4???
5? value =??();
6
7
8

The type parameter of?Value.defaultValue()is inferred and is not required to be provided. In Java 7,the same example will not compile and should be rewritten to?Value.< String >defaultValue().

2.6. Extended Annotations Support

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’s exceptions declaration. Couple of examples are show below.

01?
02
03?
04?
05?
06?
07?
08?
09
10??
11
12
13??
14
15?
16???????
17????
18
19
20?
21?
22???
23? holder =???();??????
24?? strings =??();??????
25
26

The?ElementType.TYPE_USE?and?ElementType.TYPE_PARAMETER?are two new element types to describe the applicable annotation context. The?Annotation Processing API?also underwent some minor changes to recognize those new type annotations in the Java programming language.

3. New Features in Java compiler

3.1. Parameter names

Literally for ages Java developers are inventing different ways to preserve??and make them available at runtime (for example,?). And finally,Java 8 bakes this demanding feature into the language (using Reflection API and?Parameter.getName()?method) and the byte-code (using new?javac?compiler argument?–parameters).

01?
02
03?
04?
05
06??
07????
08?
09?
10?
11
12
13

If you compile this class without using?–parameters?argument and then run this program,you will see something like that:

1

With?–parameters?argument passed to the compiler the program output will be different (the actual name of the parameter will be shown):

1

For??the?–parameters?argument could be added to the compiler using configuration section of the?maven-compiler-plugin:

01
02org.apache.maven.plugins
03maven-compiler-plugin
043.1
05
06-parameters
071.8
081.8
09
10

Latest?Eclipse Kepler SR2?release with Java 8 (please check out?) support provides useful configuration option to control this compiler setting as the picture below shows.

Picture 1. Configuring Eclipse projects to support new Java 8 compiler?–parameters?argument.

Additionally,to verify the availability of parameter names,there is a handy method?isNamePresent()?provided by?Parameter?class.

4. New Features in Java libraries

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.

4.1. Optional

The?NullPointerException?is by far the most popular cause of Java application failures. Long time ago the great?project introduced the?Optionals as a solution to?NullPointerExceptions,discouraging codebase pollution with?null?checks and encouraging developers to write cleaner code. Inspired by?,the?Optional?is now a part of Java 8 library.

Optional?is just a container: it can hold a?value?of some type?T?or just be?null. It provides a lot of useful methods so the explicit?nullchecks have no excuse anymore. Please refer to??for more details.

We are going to take a look on two small examples of?Optional?usages: with the?nullable?value and with the value which does not allownulls.

1? fullName = Optional.ofNullable( null );
2
3 "[none]" ) );
4 "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );

The?isPresent()?method returns?true?if this instance of?Optional?has non-null value and?false?otherwise. The?orElseGet()?method provides the fallback mechanism in case?Optional?has?null?value by accepting the function to generate the default one. The?map()method transforms the current?Optional’s value and returns the new?Optional?instance. The?orElse()?method is similar to?orElseGet()but instead of function it accepts the default value. Here is the output of this program:

1
2
3

Let us briefly look on another example:

1? firstName = Optional.of( "Tom" );
2
3 "[none]" ) );
4 "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
5

And here is the output:

1
2
3

For more details please refer to?

4.2. Streams

The newly??(java.util.stream) 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.

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.

01??
02??
03
04
05?
06????
07??
08??
09
10??
11
12
13
14?
15?
16?
17
18?
19?
20?
21
22?
23
24?
25?
26
27
28

Task has some notion of points (or pseudo-complexity) and can be either?OPEN?or?CLOSED. And then let us introduce a small collection of tasks to play with.

1? tasks = Arrays.asList(
2??
3??
4??
5

The first question we are going to address is how many points in total all?OPEN?tasks have? Up to Java 8,the usual solution for it would be some sort of?foreach?iteration. But in Java 8 the answers is streams: a sequence of elements supporting sequential and parallel aggregate operations.

1
2??
3
4 task.getStatus() == Status.OPEN )
5
6
7?
8?

And the output on the console looks like that:

1

There are a couple of things going on here. Firstly,the tasks collection is converted to its stream representation. Then,the?filteroperation on stream filters out all?CLOSED?tasks. On next step,the?mapToInt?operation converts the stream of?Tasks to the stream ofIntegers using?Task::getPoints?method of the each task instance. And lastly,all points are summed up using?sum?method,producing the final result.

Before moving on to the next examples,there are some notes to keep in mind about streams (). Stream operations are divided into intermediate and terminal operations.

Intermediate operations return a new stream. They are always lazy,executing an intermediate operation such as?filter?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

Terminal operations,such as?forEach?or?sum,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.

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.

1
2??
3
4
5 task.getPoints() )?
6
7?
8?

It is very similar to the first example except the fact that we try to process all the tasks in?parallel?and calculate the final result usingreduce?method.

Here is the console output:

1

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.

1
2? > map = tasks
3
4
5

The console output of this example looks like that:

1

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.

01
02? result = tasks
03
04
05
06 points / totalPoints )???
07
08 (???
09 percentage +??
10
11?
12

The console output is just here:

1

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.

1??
2 lines = Files.lines( path,StandardCharsets.UTF_8 ) ) {
3 System.out.println(
4

The?onClose?method called on the stream returns an equivalent stream with an additional close handler. Close handlers are run when the?close()?method is called on the stream.

Stream API together with??and??baked by??is the Java 8 response to the modern paradigms in software development. For more details,please refer to?.

4.3. Date/Time API (JSR 310)

Java 8 makes one more take on date and time management by delivering?. Date and time manipulation is being one of the worst pain points for Java developers. The standard?java.util.Date?followed by?java.util.Calendar?hasn’t improved the situation at all (arguably,made it even more confusing).

That is how??was born: the great alternative date/time API for Java. The Java 8’s??was heavily influenced by??and took the best of it. The new?java.time?package contains?. In the design of the API the immutability has been taken into account very seriously: no change allowed (the tough lesson learnt from?java.util.Calendar). If the modification is required,the new instance of respective class will be returned.

Let us take a look on key classes and examples of their usages. The first class is?Clock?which provides access to the current instant,date and time using a time-zone.?Clock?can be used instead of?System.currentTimeMillis()?and?TimeZone.getDefault().

1
2?
3
4

The sample output on a console:

1
2

Other new classes we are going to look at are?LocaleDate?and?LocalTime.?LocaleDate?holds only the date part without a time-zone in the ISO-8601 calendar system. Respectively,?LocaleTime?holds only the time part without time-zone in the ISO-8601 calendar system. Both?LocaleDate?and?LocaleTime?could be created from?Clock.

01
02?
03?
04?
05
06
07?
08
09?
10?
11?
12
13

The sample output on a console:

1
2
3
4

The?LocalDateTime?combines together?LocaleDate?and?LocalTime?and holds a date with time but without a time-zone in the ISO-8601 calendar system. A??is shown below.

1
2?
3?
4?
5
6

The sample output on a console:

1
2

If case you need a date/time for particular timezone,the?ZonedDateTime?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.

1
2?
3?
4??
5?
6
7
8

The sample output on a console:

1
2
3

And finally,let us take a look on?Duration?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.

1
2??
3??
4
5?
6?
7?

The example above computes the duration (in days and hours) between two dates,?16 April 2014?and?16 April 2015. Here is the sample output on a console:

1
2

The overall impression about Java 8’s new date/time API is very,very positive. Partially,because of the battle-proved foundation it is built upon (),partially because this time it was finally tackled seriously and developer voices have been heard. For more details please refer to?.

4.4. Nashorn JavaScript engine

?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.

1?
2?
3?
4
5??

The sample output on a console:

1
2

We will get back to the Nashorn later in the section?.

4.5. Base64

Finally,the??has made its way into Java standard library with Java 8 release. It is very easy to use as following example shows off.

01?
02
03?
04?
05
06??
07???
08?
09?
10?
11
12
13
14?
15??
16
17
18
19
20

The console output from program run shows both encoded and decoded text:

1
2?

There are also URL-friendly encoder/decoder and MIME-friendly encoder/decoder provided by the Base64 class (Base64.getUrlEncoder()?/?Base64.getUrlDecoder(),?Base64.getMimeEncoder()?/?Base64.getMimeDecoder()).

4.6. Parallel Arrays

Java 8 release adds a lot of new methods to allow parallel arrays processing. Arguably,the most important one is?parallelSort()?which may significantly speedup the sorting on multicore machines. The following small example demonstrates this new method family (parallelXxx) in action.

01?
02
03?
04?
05
06??
07???
08???
09?
10
11 ThreadLocalRandom.current().nextInt(??
12?
13 System.out.print( i +??
14
15?
16
17?
18 System.out.print( i +??
19
20
21

This small code snippet uses method?parallelSetAll()?to fill up arrays with 20000 random values. After that,the?parallelSort()?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):

1?????????
2?????????

4.7. Concurrency

New methods have been added to the?java.util.concurrent.ConcurrentHashMap?class to support aggregate operations based on the newly added streams facility and lambda expressions. Also,new methods have been added to the?java.util.concurrent.ForkJoinPoolclass to support a common pool (check also our?).

The new?java.util.concurrent.locks.StampedLock?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?java.util.concurrent.locks.ReadWriteLock).

New classes have been added to the?java.util.concurrent.atomic?package:

  • DoubleAccumulator
  • DoubleAdder
  • LongAccumulator
  • LongAdder

5. New Java tools

Java 8 comes with new set of command line tools. In this section we are going to look over most interesting of them.

5.1. Nashorn engine: jjs

jjs?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?func.js?with following content:

1
2?
3
4
5?

To execute this fie from command,let us pass it as an argument to?jjs:

1

The output on the console will be:

1

For more details please refer to?.

5.2. Class dependency analyzer: jdeps

jdeps?is a really great command line tool. It shows the package-level or class-level dependencies of Java class files. It accepts?.classfile,?a directory,or?JAR file?as an input. By default,?jdeps?outputs the dependencies to the system output (console).

As an example,let us take a look on dependencies report for the popular??library. To make example short,let us analyze only one JAR file:?org.springframework.core-3.0.5.RELEASE.jar.

1

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?not found.

01 C:Program FilesJavajdk1.
02
03 java.io???????????????????????????????????????????
04 java.lang?????????????????????????????????????????
05 java.lang.annotation??????????????????????????????
06 java.lang.ref?????????????????????????????????????
07 java.lang.reflect?????????????????????????????????
08 java.util?????????????????????????????????????????
09 java.util.concurrent??????????????????????????????
10 org.apache.commons.logging???????????????????????? not found
11 org.springframework.asm??????????????????????????? not found
12 org.springframework.asm.commons??????????????????? not found
13
14 java.lang?????????????????????????????????????????
15 java.lang.annotation??????????????????????????????
16 java.lang.reflect?????????????????????????????????
17 java.util

For more details please refer to?.

6. New Features in Java runtime (JVM)

The?PermGen?space??(). The JVM options?-XX:PermSize?and -XX:MaxPermSize?have been replaced by?-XX:MetaSpaceSize?and?-XX:MaxMetaspaceSize?respectively.

7. Conclusions

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.

As a confirmation of community Java 8 acceptance,recently Pivotal released?.

If you enjoyed this,then??to enjoy weekly updates and complimentary whitepapers! Also,check out?JCG Academy?for more advanced training!

You are welcome to contribute with your comments about the exciting new Java 8 features!

8. Resources

Some additional resources which discuss in depth different aspects of Java 8 features:

  • What’s New in JDK 8:?
  • The Java Tutorials:?
  • WildFly 8,JDK 8,NetBeans 8,Java EE 7:?
  • Java 8 Tutorial:?
  • JDK 8 Command-line Static Dependency Checker:?
  • The Illuminating Javadoc of JDK 8:?
  • The Dark Side of Java 8:?
  • Installing Java? 8 Support in Eclipse Kepler SR2:?
  • Java 8:?
  • Oracle Nashorn. A Next-Generation JavaScript Engine for the JVM:?

原文地址:http://www.javacodegeeks.com/2014/05/java-8-features-tutorial.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读