В Java 10 введен вывод типа локальной переменной с ключевым словом var .  Это означает, что вместо записи: 
| 1 2 3 4 5 6 | Map<Department, List<Employee>> map = newHashMap<>();// ...for(Entry<Department, List<Employee>> dept : map.entrySet()) {  List<Employee> employees = dept.getValue();  // ...} | 
  Вы можете использовать var чтобы уменьшить шаблон, следующим образом: 
| 1 2 3 4 5 6 | var map = newHashMap<Department, Employee>();// ...for(var dept : map.entrySet()) {  var employees = dept.getValue();  // ...} | 
  var устраняет необходимость написания явных типов в вашем коде.  Это не только уменьшает количество повторений, но также облегчает поддержку вашего кода, потому что, если, например, вы решите изменить типы объектов, хранящихся на вашей карте в будущем, вам потребуется изменить только одну строку кода. 
Полиморфизм:
  Теперь давайте посмотрим, как var ведет себя с полиморфным кодом.  Например, если у вас есть класс Shape с двумя подклассами, Square и Circle , какой тип будет выведен, если вы используете var v = new Circle() ?  Давайте попробуем это в JShell : 
| 01 02 03 04 05 06 07 08 09 10 11 | jshell> var v = newCircle();v ==> Circle@4e9ba398jshell> v.getClass();$13==> classCirclejshell> v = newSquare();|  Error:|  incompatible types: Square cannot be converted to Circle|  v = newSquare();|      ^----------^ | 
  Как показано выше, v имеет тип Circle и если вы попытаетесь переназначить его на Square , компилятор выдаст ошибку. 
Анонимные занятия:
  Одна из интересных вещей, которую вы можете сделать с помощью var s, — создавать анонимные классы и обращаться к полям внутри них!  Например: 
| 1 2 3 4 5 | var person = newObject() {  String name = "Joe";  intage = 10;};System.out.println(person.name + ":"+ person.age); | 
  var определяет тип анонимного класса, что означает, что вы можете использовать анонимный класс в качестве «держателя» для промежуточных значений, не создавая и не поддерживая новый класс.  Вот еще один пример, показывающий, как вы можете создавать «временные» объекты человека: 
| 1 2 3 4 5 6 7 | var persons = Stream.of("Alice", "Bob", "Charles")    .map(s -> newObject() {       String name = s;       intage = 10;    })    .collect(toList());persons.forEach(p -> System.out.println(p.name)); | 
Другие моменты, чтобы отметить:
  Вы не можете использовать var без явной инициализации (присвоение null не считается) или внутри лямбда-выражений: 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | jshell> var v;|  Error:|  cannot infer type forlocal variable v|    (cannot use 'var'on variable without initializer)|  var v;|  ^----^jshell> var v = null;|  Error:|  cannot infer type forlocal variable v|    (variable initializer is 'null')|  var v = null;|  ^-----------^jshell> var v = () -> {}|  Error:|  cannot infer type forlocal variable v|    (lambda expression needs an explicit target-type)|  var v = () -> {};|  ^---------------^ | 
| Опубликовано на Java Code Geeks с разрешения Фахда Шарифа, партнера нашей программы JCG .  См. Оригинальную статью здесь: Java 10: ключевое слово «var» Мнения, высказанные участниками Java Code Geeks, являются их собственными. |