Загрузка...

Lambda в Java

Передайте короткое действие в forEach со стрелкой. В Cue.java оставьте public-класс Cue, добавьте import java.util.ArrayList;, сохраните "oak" в типизированном списке и вызовите names.forEach(n -> System.out.println(n));. Скомпилируйте через javac Cue.java и запустите java Cue. Экран должен показать oak. Второе демо добавляет "pine", и экран покажет oak, затем pine. Опциональные Streams оставьте для следующей страницы. Этот урок — lambda, переданная в forEach, а не демо Generics с get(0) и не командная строка args.

Один элемент, одна печать через lambda

Откройте Cue.java. Оставьте имя public-класса Cue. Удалите оставшиеся демо Generics с Bin, оставшиеся Program Arguments с Flag, оставшиеся подсказки Scanner в Box и историю Shelf, если они заслоняют историю lambda. Программа не должна ждать ввод и не должна требовать слов при запуске.
Добавьте import вверху:
import java.util.ArrayList;
Внутри Cue.main постройте типизированный список, добавьте одно слово и передайте lambda в forEach:
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.forEach(n -> System.out.println(n));
Часть n -> System.out.println(n) — это lambda. n — имя параметра для одного элемента. Стрелка -> указывает на тело, которое выполняется для этого элемента. forEach вызывает это тело один раз для "oak". Экран показывает oak.

Cue forEach lambda prints oak

java
import java.util.ArrayList;

public class Cue {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.forEach(n -> System.out.println(n));
    }
}

Из папки с Cue.java выполните javac Cue.java. Когда фигурные скобки и точки с запятой согласованы, javac сам ничего не печатает. Затем запустите java Cue — не java Cue.java. Оставьте один public-класс, чтобы имя совпадало с Cue.
Пройдите запуск один раз. Java начинает с Cue.main. Список хранит "oak". forEach принимает lambda. Для первого (и единственного) элемента n равно "oak", и println пишет oak. На этой учебной форме никто не вызывает get(0). Никто не печатает 3 из демо Integer в Bin. Никто не читает args[0].
Сформулируйте правило для начинающих, глядя на экран: forEach проходит список; lambda — действие на элемент; стрелка отделяет параметр от тела. Не придумывайте конвейеры Streams на этой странице. Streams ждёт следующий опциональный урок. Не заменяйте lambda полным именованным методом в этом учебном файле — держите форму со стрелкой.
Если вы всё ещё видите только oak из names.get(0) в оставшемся файле Bin, переключитесь на Cue и оставьте строку forEach. Если javac отклоняет стрелку, проверьте, что набрали -> и что lambda стоит внутри forEach(...).

Два элемента, та же lambda

Оставьте тот же public-класс Cue. Добавьте второе слово перед forEach:
names.add("oak");
names.add("pine");
names.forEach(n -> System.out.println(n));
Снова скомпилируйте через javac Cue.java и запустите java Cue. Экран показывает oak, затем pine. forEach вызывает lambda один раз на каждый элемент по порядку. Тело lambda не меняется. Изменилась только длина списка.

Cue forEach lambda prints oak then pine

java
import java.util.ArrayList;

public class Cue {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.add("pine");
        names.forEach(n -> System.out.println(n));
    }
}

Пройдите запуск один раз. Первый вызов: n — "oak", печать oak. Второй вызов: n — "pine", печать pine. Держите два демо как две учебные формы. Сначала докажите одну печать через lambda. Затем докажите ту же lambda на двух элементах. Обе формы делят import, типизированный список и n -> System.out.println(n).
Если вы печатаете весь список через println(names) вместо forEach, видите скобки и запятые — это другая привычка. Эта страница держит одну печать на элемент через lambda.

Lambda — не только Generics и не Streams

Generics назвали тип элемента в ArrayList<String>. Lambda даёт forEach короткое действие без отдельного именованного метода на этой странице. Streams позже свяжет больше шагов со списком на следующей опциональной странице. Сегодня не смешивайте эти три работы в одном начальном файле.
oak здесь — элемент списка, который посещает forEach. Это не args[0] из Flag и не ответ Scanner. Когда оставшийся файл Bin всё ещё печатает только get(0), оставьте его как историю и держите строку forEach в Cue. Когда оставшийся Flag всё ещё требует java Flag oak, оставьте этот запуск в сторону и выполните простой java Cue.
Без стрелки javac не воспримет действие как lambda. Без forEach у lambda нет места выполнения в этой учебной форме. Держите обе части вместе на практике. Держите синтаксис Streams вроде .stream().map вне этой страницы до того урока, даже если вы видели слово Stream в другом заголовке.

Проверка папки перед Streams

После успешной компиляции перечислите папку. Должны быть вместе Cue.java и Cue.class. Отредактируйте исходник, сохраните, выполните javac Cue.java, затем java Cue. Устаревший .class может показать старую однострочную печать, если пропустить компиляцию после добавления "pine".
Если javac жалуется на дублирующий public-класс, оставьте public только у Cue. Если экран показывает [oak, pine] на одной строке, вы напечатали объект списка — вернитесь к forEach с println внутри lambda. Если ничего не печатается, убедитесь, что add выполнился до forEach.
Не вставляйте get(0) из Bin как замену lambda на этой странице. Не вставляйте слова запуска Flag в команду run. Опциональная работа lambda — forEach с телом со стрелкой.

Перед опциональными Streams

Вы можете оставить public-класс Cue, import ArrayList, добавить "oak", вызвать names.forEach(n -> System.out.println(n));, увидеть oak, затем добавить "pine" и увидеть oak затем pine. Скомпилируйте через javac Cue.java и запустите java Cue. Следующая опциональная страница — Streams.
Держите демо Cue для ясной пары lambda. При практике forEach держите файлы Generics с Bin вне этой страницы. При практике forEach держите файлы Program Arguments с Flag вне этой страницы. Работу Streams держите вне этой страницы до того урока. Эти привычки — контрольная точка перед продолжением. Когда однословный экран показывает oak или двухсловный — oak затем pine, Lambda выполнила работу этого урока, и вы готовы к Streams, если продолжите опциональный путь.
Последний проход по папке: один public Cue, import на месте, типизированный ArrayList<String>, forEach с n -> System.out.println(n), без ожидания Scanner, без слов при запуске. Ещё раз выполните javac Cue.java и java Cue на демо, которое держите открытым. Если экран всё ещё показывает oak или oak затем pine, форма Lambda крепка, и курс может перейти к опциональным Streams на следующей странице. На каждом проходе держите одну ясную привычку forEach, чтобы каждый раз училась та же карта.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
5
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху