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.
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 не меняется. Изменилась только длина списка.
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, чтобы каждый раз училась та же карта.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху