junior
Var в лямбда-выражениях (Java 11)
В Java 11 var разрешён в параметрах лямбда-выражений. Основная цель — возможность добавлять аннотации к лямбда-параметрам, что без var невозможно.
Пример
// Java 10 — var для локальных переменных
var list = new ArrayList<String>(); // тип выведен: ArrayList<String>
var stream = list.stream(); // тип выведен: Stream<String>
// Java 11 — var в лямбда-параметрах
// Без var (и так работает):
list.stream()
.filter(s -> s.length() > 3)
.toList();
// С var — позволяет добавлять аннотации:
list.stream()
.filter((@NotNull var s) -> s.length() > 3)
.toList();
// Все параметры должны быть или с var, или без:
// (var x, y) -> ошибка компиляции
// (var x, var y) -> OK
Частые ошибки
- Злоупотребление
var—var result = process()непонятно; используйтеvarкогда тип очевиден из правой части varдля полей класса — не поддерживается;varтолько для локальных переменных и лямбда-параметров- Смешивание
varи явных типов в лямбде —(var x, String y)приводит к ошибке компиляции
Как используется в 2026
varшироко используется для локальных переменных, особенно с дженериками- Стандарты кодирования:
varдопустим, когда тип очевиден; явный тип — когда нет - IntelliJ IDEA подсвечивает выведенный тип при наведении
На собеседовании: важно сказать, что
var— не ключевое слово, а зарезервированное имя типа. Главная мотивация дляvarв лямбдах — аннотации (@NonNull,@Nullable). Частая ошибка — считать, чтоvarделает Java динамически типизированной.