Java Version Changes

What are major new features in each Java version

Java 22 (2024)

Java 21 (2023)

Java 20 (2023)

Java 19 (2022)

Java 18 (2022)

Java 17 (2021)

Java 16 (2021)

Java 15 (2020)

Java 14 (2020)

Java 13 (2019)

Java 12 (2019)

Java 11 (2018)

Java 10 (2018)

Java 9 (2017)

Java 8 (2014)

Was ist eigentlich neu in Java 8?

Java8Streams

Date

Java 8 Date Time

Annotations

Eine Annotation darf jetzt mehrfach gesetzt werden

@Foo("Value1")
@Foo("Value2")
class Person {}

Die Annotation dazu sieht so aus

@Repeatable(ContainerForAllFoos.class)
@interface Foo {
    String value();
}

Und hier werden dann bei Mehrfachnutzung die Einzelwerte abgelegt

@interface ContainerForAllFoos {
    Foo[] value();
}

Nullpointer

Angenommen man hat eine Klasse die eine Liste von Freunden beinhaltet, und jeder Freund hat wiederum einen Namen. Man kann also z.B. so auf einen Namen zugreifen

friendsHolder.allFriends.get(0).getName().length();

Allerdings kann es dabei an mehreren Stellen zu einer NullPointerException kommen, was aufwendige Tests darauf notwendig machen kann

if(friendsHolder!=null &&
   friendsHolder.allFriends!=null &&
   friendsHolder.allFriends.get(0)!=null &&
   friendsHolder.allFriends.get(0).getName()!=null) {  
}

So funktioniert das mit der neuen Optional Klasse

Optional.ofNullable(friendsHolder)
        .flatMap(a -> Optional.ofNullable(a.allFriends))
        .flatMap(b -> Optional.ofNullable(b.get(0)))
        .flatMap(c -> Optional.ofNullable(c.getName()))
        .ifPresent(System.out::println);

Concurrency Java 8

Concurrency Java 8

Nashorn JavaScript Engine for the JVM

Nashorn: A Next-Generation JavaScript Engine for the JVM

Other new Java 8 Features

Java 8 new features

Java 7 (2011)

Was ist eigentlich neu in Java 7?

Lesbare Konstanten

Konstanten können mit _ lesbarer gemacht werden und es ist möglich Binärkonstanten zu verwenden:

// make constant more readable
int one_million = 1_000_000;
int oneMillion  =   1000000;
boolean equal=(one_million==oneMillion);

// add a binary constant 0b ...
int binaryNine=0b1001;
int nine=9;
boolean equal=(nine==binaryNine);

Switch mit Strings

In einem Switchblock können Strings verwendet werden

final String JOHN="john";
String result="String switch says the user is ";

switch(aString)
{
    case "Foo":
        result+="Mr. Foo";
        break;
    case "Bar":
        result+="Mr. Bar";
        break;
    case JOHN:
        result="John";
        break;
    default:
        result="a surprise";
}

Diamond Operator

Es ist nicht mehr notwendig, den Datentyp bei der Instanziierung zu wiederholen

// pre Java 1.7
HashMap<Integer, String> prejva17=new HashMap<Integer, String>();

// Java 1.7
HashMap<Integer, String> products=new HashMap<>();
products.put(123456, "Gigant TV");
products.put(1,      "DVD");

Mehr als eine Exception fangen

Man kann jetzt mehr als eine Exception auf einmal fangen und bearbeiten

try
{
    if(bang==0)
    {
        throw new IllegalArgumentException();
    }
    else
    {
        throw new IllegalStateException();
    }
}
// catch more than one exception at once
catch(IllegalArgumentException | IllegalStateException e)
{
    System.out.println("got exception "+e);
}

Ressourcen Management

Bisher war es recht aufwendig mit Ressourcen umzugehen, die auch wieder geschlossen werden müssen

// the pre Java 1.7 way
FileOutputStream fos=null;
try
{
    fos=new FileOutputStream(filename);
    // ...
}
catch (FileNotFoundException e)
{
    e.printStackTrace();
    // ...
    throw new RuntimeException(e);
}      
/* You needed a finally block to make sure your closeable resource
 * is closed under all circumstances
 */
     
finally
{
    try
    {
        if(fos!=null) fos.close();
    } catch (IOException e)
    {
        e.printStackTrace();
        // ...
        throw new RuntimeException(e);
    }
}

Jetzt können dieses Ressourcen automatisch geschlossen werden, wenn sie java.io.Closeable implementieren und innerhalb eines try Statements definiert und erzeugt werden:

/* a variable of a (sub) type of Closeable
 * inside a try will automatically issue close()
 * when the variable reaches its end of lifetime.
 * Don't forget that even the implicit close()
 * may issue an exception
 */

try(Closeable fos=new FileOutputStream(filename))
{
    // ...
}
catch (IOException e) {
    e.printStackTrace();
    // ...
    throw new RuntimeException(e);
}

Java 7 Links

Java 6 (2006)

Java 5 (2004)

https://www.oracle.com/technical-resources/articles/java/java-5-features.html

Java 4 / 1.4 (2002)

https://javaalmanac.io/jdk/1.4/