JavaRush /وبلاگ جاوا /Random-FA /لامبدا و جریان، فقط تمرین، بدون نظریه

لامبدا و جریان، فقط تمرین، بدون نظریه

در گروه منتشر شد
سلام به همه. به مناسبت مسابقه، تصمیم گرفتم اینجا نه یک مقاله، بلکه یک درس کوتاه بنویسم. این در مورد لامبداها و استریم ها در جاوا خواهد بود. اگر قبلاً با آنها آشنا هستید و از آنها استفاده می کنید، مستقیماً به انتهای مقاله بروید، مجموعه کوچکی از وظایف با JavaRush وجود دارد که می توانید روی آنها تمرین کنید. شما به جاوا 8 و بالاتر نیاز دارید، آموزش از JR، جزئیات کمی وجود خواهد داشت و چیزهای نامفهوم زیادی وجود خواهد داشت، میل شدید برای کشف آن. بیایید با این واقعیت شروع کنیم که من تاریخچه ظهور لامبداها و جریان ها را توضیح نمی دهم ، فقط خودم آن را نمی دانم. من فقط می دانم که آنها از سبک برنامه نویسی کاربردی به سبک OOP ما آمده اند. در تجربه کوتاه یادگیری خود، من به سادگی نشان دادم که چگونه و چه چیزی، برای برخی از مردم درک این ایده دشوار است، بنابراین فقط به یاد داشته باشید که چگونه بنویسید، بعداً متوجه خواهید شد.

لامبدا

لامبداها و جریان ها، فقط تمرین، بدون نظریه - 1لامبداها و جریان ها، فقط تمرین، بدون نظریه - 2اگر اصلاً نمی دانید لامبدا چیست، پس: لامبدا شبیه این است:
(a, b) -> a.compareTo(b)
(переменные) -> действие
فعلا همین کافی است. می توانید نظریه را در اینجا بخوانید: پیوند یک ، پیوند دو ، اما من فکر می کنم تمرین بسیار سرگرم کننده تر است. من به شما پیشنهاد می کنم مشکل زیر را حل کنید: با استفاده از روش 1 یک ماشین حساب بنویسید. روش باید 2 مقدار دیجیتال و چیز دیگری را بپذیرد. کد شما چیزی شبیه به این خواهد بود:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
شما باید 3 پارامتر را در امضای متد وارد کنید calculate، 1 دستور را اضافه کنید returnو این متد را در فراخوانی آزمایش کنید main. این روش باید چه کاری انجام دهد؟
  • تا کردن؛
  • تکثیر کردن؛
  • تقسیم کردن؛
  • تفریق کردن؛
  • ریشه را محاسبه کنید؛
  • بالا بردن به یک قدرت؛
  • مجموع آرگومان های تقسیم بر عدد اول + 117 را به توان برسانید.
  • و هر عملیات دیگری که می توانید به آن فکر کنید.
چه چیزی نباید استفاده شود:
  • if-else;
  • charبه عنوان یک شاخص عملکرد؛
  • switch-case;
  • و هر چیز دیگری که به ذهن شما می رسد.
آنچه می توانید استفاده کنید:
  • فقط لامبدا، وظیفه بر عهده آنهاست.
- چی؟ و این همه؟ - بله، همین است، زیرا به معنای واقعی کلمه باید 3 خط اضافه کنید، اگر حداقل یکی را پیشنهاد کنم، بقیه به طور خودکار نوشته می شوند. و در صورت تمایل می توانید نمونه های گوگل را جستجو کنید و سعی کنید متوجه شوید. البته خودت را چک می کنی و اگر تقلب کنی هیچ کس متوجه نمی شود، اما پس چرا؟ با حل چنین مشکل ساده ای، همه 1.5 دانش آموز من به درک تقریبی از چیستی لامبدا و نحوه استفاده از آنها دست یافتند. این برای استریم بسیار ضروری خواهد بود. اگر می خواهید نتیجه را لاف بزنید و متوجه شوید که آیا آن را درست انجام داده اید، کد را در پیام خصوصی ارسال کنید. نیازی به اظهار نظر نیست، می توانید نکات جالبی را در آنجا اضافه کنید (اما به گونه ای که کار را خیلی آسان نکنید). باز هم، با حل این مثال، شما باید قبلاً درک تقریبی از نحوه استفاده از لامبدا داشته باشید.
لامبدا و جریان، فقط تمرین، بدون نظریه - 3
حالا بیایید به سراغ استریم های جاوا برویم. این ها جریان هایی نیستند که شما خواننده ممکن است به آن فکر کرده باشید. نه اینطور نیست inputStreamو نیست OutputStream. متفاوت است، جالب تر است. جریان ها جایگزین چرخه ها شده اند، نه به طور کامل، اما همچنان. آنها با شعار "توضیح نده که چگونه این کار را انجام دهیم، توضیح بده که چه باید بکنم." نمونه کوچکی از جریان:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
اینجا چه خبره؟ بیایید نظرات را اضافه کنیم:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
مقایسه با یک حلقه معمولی:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
وقتی کد را می خوانید، همه چیز ترسناک به نظر می رسد، اما آیا با نظرات راحت تر است؟ این طبیعی است، من هم برای مدت طولانی آنها را درک نمی کردم. کلید درک، تمرین است. بنابراین، ما شروع به خواندن مقالات شخص ثالث می کنیم و به دنبال پاسخ سوالات خود می گردیم، همچنین می توانید آنها را در اینجا در نظرات بپرسید، من پاسخ کاملی نمی دهم، اما به سمت آن اشاره می کنم. لیست وظایف JavaRush که فکر می کنم برای تمرین جریان عالی هستند:
  • 2208 - با 1 جریان و 1 برگشت قابل حل است. بدنه روش با شروع خواهد شد returnو سپس 1 جریان کامل وجود خواهد داشت. بیایید شرط را حذف کنیم StringBuilder.

  • 1908 - شما همچنین می توانید آن را با 1 جریان و 1 بازگشت حل کنید. با خواندن فایل شروع کنید. من نمی دانم چگونه از طریق جریان ها در یک فایل ضبط کنم (اگر این امکان وجود دارد)، در حال حاضر ما این کار را به صورت دستی انجام می دهیم. آن ها ما فقط 2 جریان (کنسول و نوشتن در یک فایل) را باز می کنیم. ما فایل را از طریق روش هایی می خوانیم که یا یک برگه یا یک جریان (google و javadoc) به ما برمی گرداند.

  • 1907 - در تئوری، می توان آن را نیز در یک جریان حل کرد. ورودی جریان نام فایل است، خروجی تعداد کلمات جهان است.

همین. اگر بتوانم یک داستان ساده دیگر خواهم نوشت. به نظر من، خواندن در مورد یک چیز جالب بدون فرصت امتحان کردن، به نوعی خسته کننده است یا چیزی شبیه به آن. و بعد از ماشین‌حساب و 3 پازل، فکر می‌کنم در حال حاضر با لامبداها و استریم‌ها به خوبی کنار می‌آیید، بنابراین اگر قبلاً این کار را نکرده‌اید، همه احتمالات را بخوانید. UPD:
  • 1016 - به روشی کمی منحرف می توانید آن را در 1 جریان و 1 بازگشت حل کنید.

  • 1821 - بسیار آسان و در 1 جریان و 1 بازگشت.

    این 2 کار شما را با یک روش استریمینگ دیگر و یک کلکتور دیگر آشنا می کند.

  • 1925 - می‌توانید یک خط با کلمات در یک جریان دریافت کنید و سپس آن را در یک فایل بنویسید (نمی‌دانم آیا امکان نوشتن روی یک فایل از یک جریان وجود دارد یا خیر)

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION