تو این مقاله میخوام این ۳ تا function (یا method) دوس داشتنی و پرکاربرد رو به زبان خیلی ساده توضیح بدم.
از هیچ زبان برنامه نویسی خاصی هم استفاده نکردم که خود مفهوم رو متوجه بشید.
خب، اول این ۳ تا مورد رو بخوانید:
شما از خانه میزنی بیرون، به ۱۰ تا مغازه سرِ راهت سر میزنی و توی هر مغازه یه کاری انجام میدی، مثلا تو هر مغازه که وارد میشی میری یه سلام به صاحب مغازه میکنی. نکته مهم اینجا اینه که شما اول کار یه لیستی از مغازه ها رو داری و آخر کار هم اون لیست رو داری، فقط تو هر مغازه سلام کردی!
شما از خانه میزنی بیرون، به ۱۰ تا مغازه سرِ راهت سر میزنی و توی هر مغازه انگار دنبال یه چیزی میگردی تو این مغازه ها، مثلا تو هرکدام که وارد میشی نگاه میکنی که آیا اون مغازه شیر پرچرب داره یا نه! اگه داشت اسمش رو یاداشت میکنی و میری مغازه بعدی. نکته مهم اینجا هم اینه که شما اول کار یه لیستی از مغازه ها رو داری و آخر کار هم یه لیست داری، ولی الزاما لیستی که آخر کار داری هم اندازه لیست اول نیست دیگه، چرا؟ چون ممکنه همه اونا شیر پرچرب نداشته باشن!
شما از خانه میزنی بیرون، به ۱۰ تا مغازه سرِ راهت سر میزنی و اینجا هم انگار توی هر مغازه دنبال یه چیزی میگردی، ولی با این تفاوت که جواب آخری که دنبالشی دیگه یه لیستی از مغازه ها نیست، اینجا دیگه یه مقدار خاصی رو میخوای که یه جورایی عصاره ای از همه اون مغازه هاس!!! مثلا شما هدفت اینه که ببینی که این ۱۰ تا مغازه کلا روی هم چند تا شیر پرچرب دارن. یعنی انگار که وارد هرکدام میشی و تعداد شیری که داره رو یاداشت میکنی و آخر سر هم همه اون عدد ها رو جمع میکنی و این میشه جوابت!
شاید باورتان نشه ولی الان این ۳ تا مورد دقیقا میشن map و filter و reduce که بعضی ها تو فهمشان مشکل دارن.
حالا بریم سراغ ادامه بحث . . .
تو برنامه نویسی ما انگار که ۳ جور function یا method میتانیم بنویسیم (این فقط برای فهم موضوعه ها!):
اونایی که فقط value ها (یا variable ها) رو به عنوان ورودی میگیرن.
اونایی که function های دیگه رو به عنوان ورودی میگیرن!
و اونایی که هم variable دارن تو لیست argument هاشان و هم function.
معمولا برنامه نویس های تازه کار وقتی به اون دسته دوم برمیخورن یکم سردرگم میشن. در واقع به اون دسته دوم میگن higher order functions که معنی سادش میشه function هایی که function میگیرن (به عنوان ورودی یا argument).
این map و filter و reduce هم ۳ تا از همین higher order function ها، یعنی از همون دسته دوم هستن، به همین راحتی!
خب اگه اینا هم از اونا هستن پس یعنی اینا هم باید به عنوان ورودی یه function دیگه رو بگیرن دیگه، درسته؟ واقعیت هم همینه.
حالا توضیحات زیر رو ببینید (مثالهایی هم بعد از این بخش میبینیم که بیشتر کمک میکنه، پس اگه اینجا خوب نفهمیدید، مثالهای آخر مقاله کمک میکنه) :
وقتی از map استفاده میکنیم، انگار داریم بهش یه function میدیم و بهش دستور میدیم که برو و این function که بهت دادم رو به تک تک اعضای یه لیست apply بکن. که نتیجه هم میشه یه لیست دیگه.
وقتی از filter استفاده میکنیم، مثل بالایی اینجا هم انگار داریم بهش یه function میدیم و بهش دستور میدیم که برو و این function که بهت دادم رو به تک تک اعضای یه لیست apply بکن. ولی تفاوتش با map اینه که filter نگاه میکنه ببینه که کدام یک از اعضای اون لیست ''شرطی'' که اون function گذاشته رو میتانن برآورده کنن. پس اینجا مشخص میشه که اون function که ما به filter میدیم باید مقداری که به ما میده true یا false باشه دیگه، چون میخوایم تک تک اعضای لیست رو بهش بدیم و اون هم به ما بگه آره یا نه!!! و از این طریقه که لیست ما ''فیلتر'' میشه. اسمش هم رو خودشه! نتیجه filter هم میشه یه لیست دیگه.
وقتی از reduce استفاده میکنیم، درست مثل map و filter، اینجا هم انگار داریم بهش یه function میدیم و بهش دستور میدیم که برو و این function که بهت دادم رو به تک تک اعضای یه لیست apply بکن. ولی تفاوتش با map و filter اینه که reduce میاد و بعد از هر بار apply کردن اون function یه مقداری رو هی تو ذهنش نگه میداره!!! یه جورایی یعنی انگار که کل اعضای اون لیست همه خلاصه شدن تو یه مقدار خاص، انگار که عصاره ی تمام اون اعضاس! نتیجه reduce دیگه لیست نمیشه، میشه یه مقدار خاص که یجورایی حاصل ترکیب کردن اعضای لیسته. (حالا این ''ترکیب'' میتانه جمع کردن، تفریق کردن یا چیزای دیگه باشه)
حالا مثال برای هرکدام:
این عکس به زیبایی برای همه مثال زده (توضیحات عکس هم زیرش نوشتم) :
همونطور که می بینید . . .
ما یه function به اسم cook به map دادیم و بهش گفتیم که برو و این cook رو به تک تک اعضای لیست apply بکن. در نتیجه هم یه لیست دیگه داریم که یجورایی ورژن cook شده ی لیست اولیه!!!
ما یه function به اسم isVegetarian به filter دادیم و بهش گفتیم برو و با این ''شرط'' اون لیست رو فیلتر بکن! (یادتانه که بالا تر گفتم اون function که ما به filter میدیم باید به ما true یا false بده؟ اینجا isVegetarian تک تک اعضای اون لیست رو میگیره و به ما میگه که به ازای کدام یک از اعضای لیست true میشه)، در نتیجه هم که یه لیست فیلتر شده جدید داریم.
ما یه function به اسم eat میدیم به reduce و بهش میگیم که برو و اعضای لیست رو بخور! یعنی چه؟ یعنی این عمل ''خوردن یا eat'' یه جور ترکیب کردن اعضا میشه دیگه! (البته ببخشید اگه نتیجه reduce رضایت بخش نیست!!!)