JavaRush /Java Blogu /Random-AZ /Lambdalar və axınlar, yalnız təcrübə, nəzəriyyə yoxdur

Lambdalar və axınlar, yalnız təcrübə, nəzəriyyə yoxdur

Qrupda dərc edilmişdir
Hamıya salam. Müsabiqə münasibəti ilə burada məqalə yox, qısa bir dərs yazmaq qərarına gəldim. Java-da lambdalar və axınlar haqqında olacaq. Əgər siz artıq tanışsınızsa və onlardan istifadə edirsinizsə, onda birbaşa məqalənin sonuna keçin, JavaRush ilə məşq edə biləcəyiniz kiçik tapşırıqlar seçimi olacaq. Sizə java 8 və daha yüksək, JR-dən təlim lazımdır, az təfərrüatlar və çoxlu anlaşılmaz şeylər, onu anlamaq üçün güclü istək olacaq. Gəlin ondan başlayaq ki, lambdaların və axınların yaranma tarixini izah etməyəcəm, sadəcə özüm bilmirəm. Mən yalnız onların funksional proqramlaşdırma tərzindən, bizim OOP üslubumuza gəldiyini bilirəm. Qısa öyrənmə təcrübəmdə sadəcə olaraq necə və nəyi göstərdim, bəzi insanlar fikri başa düşməkdə çətinlik çəkirlər, ona görə də necə yazmağı unutmayın, sonra başa düşəcəksiniz.

Lambdalar

Lambdalar və axınlar, yalnız təcrübə, nəzəriyyə yoxdur - 1Lambdalar və axınlar, yalnız təcrübə, nəzəriyyə yoxdur - 2Lambdaların nə olduğunu ümumiyyətlə bilmirsinizsə, onda: Lambda belə görünür:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Hələlik bu kifayətdir. Nəzəriyyəni burada oxuya bilərsiniz: bir keçid , ikinci keçid , amma məncə təcrübə daha əyləncəlidir. Aşağıdakı problemi həll etməyi təklif edirəm: 1-ci üsuldan istifadə edərək kalkulyator yazın. Metod 2 rəqəmsal dəyər və başqa bir şeyi qəbul etməlidir. Kodunuz belə görünəcək:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Metod imzasına 3 parametr daxil etməli calculate, 1 əmr əlavə etməli returnvə bu metodu çağıraraq test etməlisiniz main. Bu üsul nəyi bacarmalıdır?
  • qat;
  • çoxaltmaq;
  • bölmək;
  • çıxmaq;
  • kök hesablamaq;
  • gücə yüksəltmək;
  • birinci rəqəmə bölünən arqumentlərin cəmini + 117-yə yüksəlt;
  • və ağlınıza gələn bütün digər əməliyyatlar.
Nə istifadə edilməməlidir:
  • if-else;
  • charəməliyyat göstəricisi kimi;
  • switch-case;
  • və ağlınıza gələn hər şey.
Nə istifadə edə bilərsiniz:
  • Yalnız lambdalar, vəzifə onların üzərindədir.
- Nə? Və hamısı? - Bəli, hamısı budur, çünki sözün həqiqi mənasında 3 sətir əlavə etməlisiniz, ən azı birini təklif etsəm, qalanları avtomatik olaraq yazılacaq. İstəyirsinizsə, google-da nümunələr axtarıb başa düşməyə çalışa bilərsiniz. Təbii ki, özünüzü yoxlayacaqsınız və aldatsanız, heç kim bilməyəcək, amma niyə? Belə sadə bir problemi həll etdikdən sonra mənim 1,5 tələbəmin hamısı lambdaların nə olduğu və onlardan necə istifadə ediləcəyi haqqında təxmini bir anlayış əldə etdilər. Bu axın üçün çox lazım olacaq. Nəticə ilə öyünmək və bunu düzgün etdiyinizi öyrənmək istəyirsinizsə, kodu şəxsi mesaja göndərin. Şərh etməyə ehtiyac yoxdur, orada maraqlı məsləhətlər əlavə edə bilərsiniz (lakin tapşırığı çox asanlaşdırmayacaq şəkildə). Yenə də, bu nümunəni həll etdikdən sonra, lambdaların necə istifadə olunacağına dair kobud bir anlayışa sahib olmalısınız.
Lambdalar və axınlar, yalnız təcrübə, nəzəriyyə yoxdur - 3
İndi keçək java axınlarına. Bunlar sizin oxucunun düşündüyü axınlar deyil. Xeyr deyil inputStreamvə deyil OutputStream. Fərqlidir, daha maraqlıdır. Axınlar dövrləri əvəz etdi, tamamilə yox, amma yenə də. Onlara “bunu necə edəcəyini izah etmə, nə edəcəyini izah et” devizi ilə xidmət edirlər. Kiçik bir axın nümunəsi:
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);
Burda nə baş verir? Şərhlər əlavə edək:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Adi bir döngə ilə müqayisə edin:
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);
}
Kodu oxuyanda hər şey qorxulu görünür, amma şərhlərlə daha asandır? Bu normaldır, mən də uzun müddət onları başa düşmürdüm. Anlamanın açarı təcrübədir. Buna görə də, üçüncü tərəfin məqalələrini oxumağa və suallarımıza cavab axtarmağa başlayırıq, siz də şərhlərdə buradan soruşa bilərsiniz, mən tam cavab verməyəcəyəm, amma istiqaməti göstərəcəyəm. Yayımla məşğul olmaq üçün əla olduğunu düşündüyüm JavaRush tapşırıqlarının siyahısı:
  • 2208 - 1 axın və 1 dönüş ilə həll edilə bilər, yəni. metodun gövdəsi ilə başlayacaq returnvə sonra 1 tam axın olacaq. Tələbi buraxaq StringBuilder.

  • 1908 - 1 axın və 1 dönüşlə də həll edə bilərsiniz. Faylı oxumaqla başlayın. Axınlar vasitəsilə fayla necə yazacağımı bilmirəm (əgər bu mümkündürsə), indi bunu əl ilə edirik. Bunlar. Yalnız 2 axın açırıq (konsol və fayla yazmaq). Faylı bizə vərəq və ya axın (google və javadoc) qaytaracaq üsullarla oxuyuruq.

  • 1907 - nəzəri olaraq, bir axınla da həll edilə bilər. Axına giriş fayl adıdır, çıxış dünya sözlərinin sayıdır.

Hamısı budur. Bacarsam, başqa bir sadə hekayə yazacam. Məncə, sınamaq imkanı olmadan sərin bir şey haqqında oxumaq nədənsə darıxdırıcı və ya başqa bir şeydir. Kalkulyatordan və 3 tapmacadan sonra, məncə, siz artıq lambdalar və axınlarla yaxşı yola gedirsiniz, ona görə də oxumamısınızsa, bütün imkanlar haqqında oxuyun. UPD:
  • 1016 - bir az pozulmuş şəkildə, 1 axın və 1 dönüşdə həll edə bilərsiniz;

  • 1821 - çox asan və 1 axın və 1 qayıdışda.

    Bu 2 tapşırıq sizi başqa axın metodu və başqa kolleksiyaçı ilə tanış edəcək.

  • 1925 - bir axındakı sözlərdən ibarət bir sətir əldə edə və sonra onu fayla yaza bilərsiniz (bir axından fayla yazmağın mümkün olub olmadığını bilmirəm)

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION