Java 10 Local Type Inference

Local Type Inference Example

In the past, we needed to repeat ourselves a lot when doing obvious things, for example here we have to declare the type of variable, even though it is obvious to both us and java:

List<String> variable = List.of("A", "B", "C");

We can save a lot of boilerplate using local type inference to let java work out the type automatically:

package xyz.byexample.java10;

public class Inference {
    public static void main(String[] args) {
        var variable = List.of("A", "B", "C");
        System.out.println(variable.getClass().getName());
    }
}

Output

java.util.ImmutableCollections$ListN

Note that variable still has a static type. Using var does not turn java into a dynamic language where anything can go in any variable.

For example if we use var to infer a string type, and then trying to assign an int type value to it, we get an error.

 var variable = "Hello";
 variable = 123;

Output

Error:(6, 14) java: incompatible types: int cannot be converted to java.lang.String

Streams Example

We can save a lot of typing using local type inference with streams.

For example consider our (Java 8 examples for filtering a stream)[/java/8/filters/]:

List<Integer> numbers = Arrays.asList(1,2,3,4,5);

List<Integer> lessThanThree = numbers.stream()
        .filter((Integer number) -> {
            return number < 3;
        })
        .collect(Collectors.toList());

System.out.println(lessThanThree);

If we convert this to use local type inference we can reduce a load of boiler plate to make our code clearer and easier to read and maintain:

var numbers = Arrays.asList(1,2,3,4,5);

var lessThanThree = numbers.stream()
        .filter(number -> {
            return number < 3;
        })
        .collect(Collectors.toList());

System.out.println(lessThanThree);

Obviously a very simple example - I am sure you all will have seen some hideous examples.