JavaRush /Java blogi /Random-UZ /Lambdalar va oqimlar, faqat amaliyot, nazariya yo'q

Lambdalar va oqimlar, faqat amaliyot, nazariya yo'q

Guruhda nashr etilgan
Hammaga salom. Tanlov munosabati bilan bu yerda maqola emas, qisqacha dars yozishga qaror qildim. Bu Java-dagi lambdalar va oqimlar haqida bo'ladi. Agar siz allaqachon tanish bo'lsangiz va ulardan foydalansangiz, to'g'ridan-to'g'ri maqolaning oxiriga o'ting, JavaRush bilan mashq qilishingiz mumkin bo'lgan kichik vazifalar tanlovi bo'ladi. Sizga java 8 va undan yuqori versiyalar kerak, JR-dan o'qitish, ozgina tafsilotlar va juda ko'p tushunarsiz narsalar bo'ladi, buni aniqlash uchun kuchli istak. Keling, bundan boshlaylik, men lambdalar va oqimlarning paydo bo'lish tarixini tushuntirmayman, men buni o'zim bilmayman. Men faqat ular funktsional dasturlash uslubidan, bizning OOP uslubimizga kelganligini bilaman. Qisqa o'rganish tajribamda men oddiygina qanday qilib va ​​nimani ko'rsatdim, ba'zi odamlar bu fikrni tushunish qiyin, shuning uchun qanday yozishni unutmang, keyinroq tushunasiz.

Lambdalar

Lambdalar va oqimlar, faqat amaliyot, nazariya yo'q - 1Lambdalar va oqimlar, faqat amaliyot, nazariya yo'q - 2Agar siz lambdalar nima ekanligini umuman bilmasangiz, unda: Lambda quyidagicha ko'rinadi:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Hozircha bu yetarli. Siz nazariyani bu yerda o'qishingiz mumkin: birinchi havola , ikkinchi havola , lekin menimcha, amaliyot ancha qiziqarli. Men sizga quyidagi muammoni hal qilishni taklif qilaman: 1-usul yordamida kalkulyator yozing. Usul ikkita raqamli qiymatni va boshqa narsalarni qabul qilishi kerak. Sizning kodingiz shunday ko'rinadi:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Usul imzosiga 3 ta parametrni kiritishingiz calculate, 1 ta buyruqni kiritishingiz returnva ushbu usulni chaqirishni sinab ko'rishingiz kerak main. Bu usul nimaga qodir bo'lishi kerak?
  • katlama;
  • ko'paytirmoq;
  • bo'lmoq;
  • ayirish;
  • ildizni hisoblash;
  • kuchga ko'tarish;
  • argumentlar yig'indisini birinchi raqamga + 117 ga bo'lingan kuchga ko'taring;
  • va siz o'ylashingiz mumkin bo'lgan barcha boshqa operatsiyalar.
Nimani ishlatmaslik kerak:
  • if-else;
  • charoperatsiya ko'rsatkichi sifatida;
  • switch-case;
  • va xayolingizga kelgan hamma narsa.
Siz nimadan foydalanishingiz mumkin:
  • Faqat lambdalar, vazifa ularda.
- Nima? Va bu hammasi? - Ha, hammasi shu, chunki siz tom ma'noda 3 qator qo'shishingiz kerak, agar men kamida bitta taklif qilsam, qolganlari avtomatik ravishda yoziladi. Agar xohlasangiz, Google misollarini ko'rishingiz va tushunishga harakat qilishingiz mumkin. Albatta, siz o'zingizni tekshirasiz va agar siz aldasangiz, hech kim bilmaydi, lekin nima uchun? Bunday oddiy masalani hal qilib, 1,5 nafar shogirdlarimning barchasi lambdalar nima ekanligini va ulardan qanday foydalanish haqida taxminiy tushunchaga ega bo‘lishdi. Bu oqim uchun juda zarur bo'ladi. Agar siz natija bilan maqtanmoqchi bo'lsangiz va buni to'g'ri bajarganingizni bilmoqchi bo'lsangiz, kodni shaxsiy xabarga yuboring. Sharh berishning hojati yo'q, siz u erda qiziqarli maslahatlarni qo'shishingiz mumkin (lekin vazifani juda oson qilmaslik uchun). Shunga qaramay, ushbu misolni hal qilganingizdan so'ng, siz lambdalardan qanday foydalanish haqida taxminiy tushunchaga ega bo'lishingiz kerak.
Lambdalar va oqimlar, faqat amaliyot, nazariya yo'q - 3
Endi java oqimlariga o'tamiz. Bu siz, o'quvchi, o'ylagan oqimlar emas. Yo'q, unday emas inputStreamva yo'q OutputStream. Bu boshqacha, qiziqroq. Oqimlar tsikllarni almashtirdi, to'liq emas, lekin baribir. Ularga "buni qanday qilishni tushuntirmang, nima qilishni tushuntiring" shiori bilan xizmat qiladi. Oqimning kichik misoli:
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);
Bu yerda nima bo'lyapti? Keling, sharhlar qo'shamiz:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Oddiy halqa bilan solishtiring:
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);
}
Kodni o'qiganingizda, hamma narsa qo'rqinchli ko'rinadi, ammo sharhlar bilan osonroqmi? Bu normal holat, men ham ularni uzoq vaqt tushunmadim. Tushunishning kaliti bu amaliyotdir. Shuning uchun biz uchinchi tomon maqolalarini o'qishni boshlaymiz va savollarimizga javob izlaymiz, siz ularni sharhlarda ham so'rashingiz mumkin, men to'liq javob bermayman, lekin men yo'nalishni ko'rsataman. JavaRush-dan strimingni mashq qilish uchun ajoyib deb hisoblagan vazifalar ro'yxati:
  • 2208 - 1 oqim va 1 qaytish bilan hal qilinishi mumkin, ya'ni. usulning tanasi boshlanadi returnva keyin 1 butun oqim bo'ladi. Keling, talabni chetlab o'tamiz StringBuilder.

  • 1908 yil - siz uni 1 oqim va 1 qaytish bilan ham hal qilishingiz mumkin. Faylni o'qishdan boshlang. Oqimlar orqali faylga qanday yozishni bilmayman (agar bu mumkin bo'lsa), biz buni qo'lda qilamiz. Bular. Biz faqat 2 ta oqimni ochamiz (konsol va faylga yozish). Biz faylni bizga varaq yoki oqim (google va javadoc) qaytaradigan usullar orqali o'qiymiz.

  • 1907 yil - nazariy jihatdan uni bir oqimda ham hal qilish mumkin. Oqimga kirish fayl nomi, chiqish dunyo so'zlari soni.

Ana xolos. Iloji bo'lsa, boshqa oddiy hikoya yozaman. Menimcha, sinab ko'rish imkoniyatisiz ajoyib narsa haqida o'qish qandaydir zerikarli yoki boshqa narsadir. Va kalkulyator va 3 ta jumboqdan so'ng, siz allaqachon lambdalar va oqimlar bilan yaxshi munosabatda bo'ldingiz deb o'ylayman, shuning uchun agar sizda hali yo'q bo'lsa, barcha imkoniyatlar haqida o'qing. UPD:
  • 1016 - biroz buzuq tarzda, siz 1 oqim va 1 qaytishda hal qilishingiz mumkin;

  • 1821 - juda oson va 1 oqim va 1 qaytishda.

    Ushbu 2 vazifa sizni boshqa oqim usuli va boshqa kollektor bilan tanishtiradi.

  • 1925 yil - siz bitta oqimda so'zlardan iborat qatorni olishingiz va keyin uni faylga yozishingiz mumkin (faylga oqimdan yozish mumkinligini bilmayman)

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION