Lambda در Java
با پیکان یک عمل کوتاه به forEach بدهید. در Cue.java کلاس عمومی 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 را باز کنید. نام کلاس عمومی را Cue نگه دارید. دموهای باقیماندهٔ Generics با Bin، اجراهای باقیماندهٔ program-arguments با Flag، پرسوجوهای باقیماندهٔ Scanner در Box، و تاریخچهٔ باقیماندهٔ Shelf را پاک کنید اگر داستان lambda را میپوشانند. برنامه نباید منتظر تایپ شما بماند و نباید کلمهٔ launch لازم داشته باشد.
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. یک کلاس عمومی نگه دارید تا نام با Cue یکی بماند.
یکبار اجرا را قدمبهقدم ببینید. Java از Cue.main شروع میکند. لیست "oak" را نگه میدارد. forEach lambda را میگیرد. برای اولین (و تنها) عنصر، n برابر "oak" است و println مقدار oak را مینویسد. در این شکل آموزشی هیچجا get(0) صدا زده نمیشود. هیچچیز عدد 3 را از دموی Integer در Bin چاپ نمیکند. هیچچیز args[0] را نمیخواند.
همانطور که صفحه را نگاه میکنید قانون مبتدی را بگویید: forEach لیست را میپیماید؛ lambda عمل هر عنصر است؛ پیکان پارامتر را از بدنه جدا میکند. Streams را روی این صفحه نسازید. Streams منتظر درس اختیاری بعدی است. lambda را با یک متد نامدار کامل عوض نکنید — شکل پیکان را نگه دارید.
اگر هنوز در فایل باقیماندهٔ Bin فقط oak از names.get(0) میبینید، به Cue بروید و خط forEach را نگه دارید. اگر javac پیکان را رد کرد، -> را درست تایپ کرده باشید و lambda داخل forEach(...) باشد.
دو عنصر، همان lambda
همان کلاس عمومی 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) را مشترک دارند.
اگر بهجای forEach کل لیست را با println(names) چاپ کنید، براکت و ویرگول میبینید — عادت دیگری است. این صفحه یک چاپ به ازای هر عنصر از مسیر 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 میخواهد، آن عادت launch را کنار بگذارید و ساده java Cue را اجرا کنید.
بدون پیکان، javac عمل را lambda حساب نمیکند. بدون forEach، lambda در این شکل آموزشی جایی برای اجرا ندارد. هر دو قطعه را با هم نگه دارید تا تمرین کنید. سینتکس Streams مثل .stream().map را تا آن درس از این صفحه دور نگه دارید، حتی اگر کلمهٔ Stream را جای دیگر دیده باشید.
بررسی پوشه قبل از Streams
بعد از کامپایل موفق پوشه را لیست کنید. باید Cue.java و Cue.class را با هم ببینید. سورس را ویرایش کنید، ذخیره کنید، javac Cue.java را بزنید، بعد java Cue را اجرا کنید. اگر بعد از اضافه کردن "pine" دوباره کامپایل نکنید، .class قدیمی ممکن است صفحهٔ یکخطی قدیمی نشان دهد.
اگر javac از کلاس عمومی تکراری شکایت کرد، فقط Cue عمومی بماند. اگر صفحه [oak, pine] را در یک خط نشان داد، شیء لیست را چاپ کردهاید — به forEach با println داخل lambda برگردید. اگر چیزی چاپ نشد، قبل از forEach، add واقعاً اجرا شده باشد.
get(0) از Bin را جایگزین lambda روی این صفحه نچسبانید. کلمات launch از Flag را داخل دستور اجرا نچسبانید. کار اختیاری lambda همان forEach با بدنهٔ پیکان است.
قبل از Streams اختیاری
میتوانید کلاس عمومی Cue، import ArrayList، add از "oak"، names.forEach(n -> System.out.println(n));، دیدن oak، بعد add از "pine" و دیدن oak و بعد pine را نگه دارید. با javac Cue.java ترجمه کنید و java Cue را اجرا کنید. صفحهٔ اختیاری بعدی Streams است.
دموهای Cue را برای جفت lambda واضح نگه دارید. فایلهای Generics با Bin را هنگام تمرین forEach از این صفحه دور نگه دارید. فایلهای program-arguments با Flag را هنگام تمرین forEach از این صفحه دور نگه دارید. کار Streams را تا آن درس از این صفحه دور نگه دارید. این عادتها نقطهٔ عبور قبل از ادامهٔ مسیر اختیاری هستند. وقتی صفحهٔ یککلمهای oak یا صفحهٔ دوکلمهای oak و بعد pine را نشان میدهد، Lambda کار این درس را کرده و اگر مسیر اختیاری را ادامه دهید برای Streams آمادهاید.
یک نوبت آخر روی پوشه: یک Cue عمومی، import حاضر، ArrayList<String> تایپشده، forEach با n -> System.out.println(n)، بدون انتظار Scanner، بدون کلمهٔ launch. یکبار دیگر javac Cue.java و java Cue را روی دمویی که باز نگه داشتهاید بزنید. اگر صفحه هنوز oak یا oak و بعد pine را نشان میدهد، شکل Lambda محکم است و دوره میتواند به Streams اختیاری در صفحهٔ بعد برود. برای هر خواندن یک عادت forEach روشن نگه دارید تا هر بار همان نقشه را یاد بگیرید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود