Gymterview
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

Частые ошибки

  • Злоупотребление varvar result = process() непонятно; используйте var когда тип очевиден из правой части
  • var для полей класса — не поддерживается; var только для локальных переменных и лямбда-параметров
  • Смешивание var и явных типов в лямбде — (var x, String y) приводит к ошибке компиляции

Как используется в 2026

  • var широко используется для локальных переменных, особенно с дженериками
  • Стандарты кодирования: var допустим, когда тип очевиден; явный тип — когда нет
  • IntelliJ IDEA подсвечивает выведенный тип при наведении

На собеседовании: важно сказать, что var — не ключевое слово, а зарезервированное имя типа. Главная мотивация для var в лямбдах — аннотации (@NonNull, @Nullable). Частая ошибка — считать, что var делает Java динамически типизированной.