JavaRush /Java блогы /Random-KK /Ламбдалар мен ағындар, тек тәжірибе, теория жоқ

Ламбдалар мен ағындар, тек тәжірибе, теория жоқ

Топта жарияланған
Бәріңе сәлем. Байқауға орай мен мұнда мақала емес, қысқаша сабақ жазуды жөн көрдім. Бұл Java тіліндегі ламбдалар мен ағындар туралы болады. Егер сіз бұрыннан таныс болсаңыз және оларды қолдансаңыз, онда тікелей мақаланың соңына өтіңіз, JavaRush көмегімен жаттығулардың шағын таңдауы болады, олар бойынша тәжірибе жасай аласыз. Сізге java 8 және одан жоғары нұсқасы керек, JR-ден оқу керек, егжей-тегжейлер аз және түсініксіз нәрселер көп болады, оны анықтауға деген қатты ұмтылыс. Ламбдалар мен ағындардың пайда болу тарихын түсіндірмеймін, мен оны өзім білмеймін. Мен олардың функционалдық бағдарламалау стилінен, біздің OOP стиліне келгенін ғана білемін. Өзімнің қысқаша оқу тәжірибемде мен жай ғана қалай және нені көрсеттім, кейбір адамдар идеяны түсіну қиынға соғады, сондықтан қалай жазу керектігін есте сақтаңыз, кейінірек түсінесіз.

Ламбдалар

Ламбдалар мен ағындар, тек тәжірибе, теория жоқ - 1Ламбдалар мен ағындар, тек тәжірибе, теория жоқ - 2Егер сіз ламбдалардың не екенін мүлде білмесеңіз, онда: Ламбда келесідей көрінеді:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Әзірге бұл жеткілікті. Теорияны мына жерден оқи аласыз: бірінші сілтеме , екінші сілтеме , бірақ менің ойымша, тәжірибе әлдеқайда қызықты. Мен сізге келесі есепті шешуді ұсынамын: 1-әдіспен калькулятор жазыңыз. Әдіс 2 сандық мәнді және басқа нәрсені қабылдауы керек. Сіздің codeыңыз келесідей болады:
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 жолды қосу керек, егер мен кем дегенде біреуін ұсынсам, қалғаны автоматты түрде жазылады. Ал егер қаласаңыз, Google мысалдарын іздеп, түсінуге тырысыңыз. Әрине өзіңізді тексересіз, алдасаңыз ешкім білмейді, бірақ неге? Осындай қарапайым есепті шешкеннен кейін, менің 1,5 оқушымның барлығы ламбда деген не және оларды қалай пайдалану керектігі туралы дөрекі түсінікке ие болды. Бұл трансляция үшін өте қажет болады. Нәтижемен мақтанғыңыз келсе және оны дұрыс жасағаныңызды білгіңіз келсе, codeты жеке хабарламаға жіберіңіз. Түсініктеме жазудың қажеті жоқ, ол жерде қызықты кеңестер қосуға болады (бірақ тапсырманы тым жеңілдетпейтіндей етіп). Тағы да, бұл мысалды шешкеннен кейін, сіз ламбдаларды қалай пайдалану керектігі туралы шамамен түсінікке ие болуыңыз керек.
Ламбдалар мен ағындар, тек тәжірибе, теория жоқ - 3
Енді java ағындарына көшейік. Бұл сіз, оқырман, ойлаған ағындар емес. Жоқ олай емес 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