JavaRush /Блоги Java /Random-TG /Дар бораи ифодаҳои лямбда дар Java маъмул аст. Бо мисолхо...
Стас Пасинков
Сатҳи
Киев

Дар бораи ифодаҳои лямбда дар Java маъмул аст. Бо мисолхо ва вазифахо. Қисми 1

Дар гурӯҳ нашр шудааст
Ин мақола барои кӣ аст?
  • Барои онҳое, ки фикр мекунанд, ки Java Core-ро аллакай хуб медонанд, аммо дар бораи ифодаҳои лямбда дар Java тасаввурот надоранд. Ё, шояд, шумо аллакай дар бораи ламбдаҳо чизе шунидаед, аммо бидуни тафсилот.
  • барои онҳое, ки дар бораи ибораҳои лямбда каме фаҳманд, аммо то ҳол аз истифодаи онҳо метарсанд ва ғайриоддӣ ҳастанд.
Агар шумо ба яке аз ин категорияҳо дохил нашавед, шумо метавонед ин мақоларо дилгиркунанда, нодуруст ва умуман "назаррас" пайдо кунед. Дар ин ҳолат, ё озодона аз назди худ гузаред, ё агар шумо дар ин мавзӯъ хуб огоҳ бошед, дар шарҳҳо пешниҳод кунед, ки чӣ гуна ман метавонам мақоларо такмил диҳам ё илова кунам. Мавод ягон арзиши академиро талаб намекунад, на камтар аз навоварӣ. Баръакс, баръакс: дар он ман кӯшиш мекунам, ки чизҳои мураккабро (барои баъзеҳо) то ҳадди имкон содда тавсиф кунам. Ман илҳом гирифтам, ки аз дархости шарҳ додани api ҷараён нависам. Ман дар ин бора фикр кардам ва қарор додам, ки бидуни фаҳмидани ибораҳои лямбда, баъзе мисолҳои ман дар бораи "ҷӯйҳо" нофаҳмо хоҳанд буд. Пас биёед бо ламбдаҳо оғоз кунем. Дар бораи ифодаҳои лямбда дар Java маъмул аст.  Бо мисолхо ва вазифахо.  Қисми 1 - 1Барои фаҳмидани ин мақола чӣ дониш лозим аст:
  1. Фаҳмиши барномасозии ба an object нигаронидашуда (минбаъд OOP номида мешавад), аз ҷумла:
    • донистани синфҳо ва an objectҳо, фарқияти байни онҳо чӣ гуна аст;
    • донистани интерфейсҳо, чӣ гуна онҳо аз синфҳо, чӣ гуна робитаи байни онҳо (интерфейсҳо ва синфҳо);
    • донистани усул, чӣ гуна номида шудан, чӣ гуна усули абстрактӣ (ё усули бидуни татбиқ), кадом параметрҳо/аргументҳои метод, чӣ гуна ба он ҷо гузаштан;
    • тағирдиҳандаҳои дастрасӣ, усулҳои статикӣ/тағйирёбандаҳо, усулҳои ниҳоӣ/тағйирёбандаҳо;
    • мерос (синфҳо, интерфейсҳо, мероси сершумори интерфейсҳо).
  2. Дониши Java Core: генерикҳо, коллексияҳо (рӯйхатҳо), риштаҳо.
Хуб, биёед оғоз кунем.

Як каме таърих

Ифодаҳои Lambda ба Java аз барномасозии функсионалӣ ва дар он ҷо аз математика омадаанд. Дар миёнаҳои асри 20 дар Амрико як калисои Алонзо дар Донишгоҳи Принстон кор мекард, ки ба математика ва ҳама гуна абстраксияҳо хеле дӯст медошт. Маҳз калисои Алонзо буд, ки ҳисобҳои ламбдаро таҳия кард, ки дар аввал маҷмӯи баъзе ғояҳои абстрактӣ буд ва бо барномасозӣ ҳеҷ иртиботе надошт. Ҳамзамон дар ҳамон донишгоҳи Принстон риёзидонҳое мисли Алан Тюринг ва Ҷон фон Нейман кор мекарданд. Ҳама чиз якҷоя шуд: Черч бо системаи ҳисобкунии ламбда баромад, Тюринг мошини абстрактии ҳисоббарории худро таҳия кард, ки ҳоло бо номи "машинаи Тюринг" маъруф аст. Хуб, фон Нейман диаграммаи меъмории компютерҳоро пешниҳод кард, ки асоси компютерҳои муосирро ташкил медод (ва ҳоло онро «архитектураи фон Нейман» меноманд). Дар он вакт акидахои Алонзо Черч мисли кори хамкасбонаш (ба истиснои сохаи математикаи «соф») шухрат пайдо накарданд. Бо вуҷуди ин, каме дертар, як Ҷон Маккарти (инчунин хатмкардаи Донишгоҳи Принстон, дар замони ҳикоя - корманди Донишкадаи технологии Массачусетс) ба ғояҳои Черч шавқ пайдо кард. Дар асоси онхо соли 1958 аввалин забони программасозии функсионалии Lisp-ро офарид. Ва пас аз 58 сол, идеяҳои барномасозии функсионалӣ ба Java ҳамчун рақами 8 ворид шуданд. Аз байн 70 сол ҳам нагузаштааст... Воқеан, ин муддати тӯлонитарин давраи татбиқи идеяи математикӣ дар амал нест.

Мохият

Ифодаи лямбда чунин функсия аст. Шумо метавонед инро ҳамчун усули муқаррарӣ дар Java фикр кунед, ягона фарқият дар он аст, ки он метавонад ба усулҳои дигар ҳамчун далел интиқол дода шавад. Бале, ба усулхо на танхо ракамхо, сатрхо ва катхо гузаштан, балки усулхои дигар хам имкон пайдо шуд! Ин кай ба мо лозим аст? Масалан, агар мо хоҳем, ки занги бозгаштро гузаронем. Ба мо усуле лозим аст, ки мо даъват мекунем, то тавонем ягон усули дигареро даъват кунем, ки мо ба он мегузарем. Яъне, мо имкон дорем, ки як занги бозпасро дар баъзе мавридҳо интиқол диҳем ва дар дигар ҳолатҳо. Ва усули мо, ки зангҳои моро қабул мекунад, онҳоро даъват мекунад. Як мисоли оддӣ навъбандӣ аст. Биёед бигӯем, ки мо як навъ ҷудокунии душворро менависем, ки ба ин монанд аст:
public void mySuperSort() {
    // ... do something here
    if(compare(obj1, obj2) > 0)
    // ... and here we do something
}
Дар куҷо, ifки мо методро меномем compare(), ду an objectро ба он ҷо мегузорем, ки мо муқоиса мекунем ва мо мехоҳем бифаҳмем, ки кадоме аз ин an objectҳо "калонтар" аст. Мо он чизеро, ки "бештар" аст, пеш аз "хурдтар" мегузорем. Ман "бештар" -ро дар нохунак навиштам, зеро мо як усули универсалӣ менависем, ки қодир аст на танҳо аз рӯи болоравӣ, балки бо тартиби коҳиш низ ҷудо карда шавад (дар ин ҳолат, "бештар" an objectест, ки аслан хурдтар аст ва баръакс). . Барои муқаррар кардани қоида барои маҳз чӣ гунае, ки мо мехоҳем ҷудо кунем, ба мо лозим аст, ки бо ягон роҳ онро ба mySuperSort(). Дар ин ҳолат, мо метавонем ҳангоми даъват кардани он усули худро бо ягон роҳ "назорат" кунем. Албатта, шумо метавонед ду усули ҷудогонаро mySuperSortAsc()барои mySuperSortDesc()ба тартиб даровардани тартиби афзоиш ва камшавӣ нависед. Ё баъзе параметрҳоро дар дохor усул гузаронед (масалан, booleanагар true, бо тартиби афзоиш, ва агар falseбо тартиби камшавӣ). Аммо чӣ мешавад, агар мо нахоҳем сохтори оддӣ, балки, масалан, рӯйхати массивҳои сатрро ҷудо кунем? Усули мо аз куҷо mySuperSort()медонад, ки ин массивҳои сатрро чӣ гуна ҷудо кардан мумкин аст? Ба андоза? Аз рӯи дарозии умумии калимаҳо? Шояд аз рӯи алифбо, вобаста ба сатри аввал дар массив? Аммо агар дар баъзе мавридҳо ба мо лозим аст, ки рӯйхати массивҳоро аз рӯи андозаи массив ва дар ҳолати дигар аз рӯи дарозии умумии калимаҳои массив ҷудо кунем? Ман фикр мекунам, ки шумо аллакай дар бораи муқоисакунандагон шунидаед ва дар чунин ҳолатҳо мо танҳо як an objectи муқоисакунандаро ба усули мураттабсозии худ мегузарем, ки дар он мо қоидаҳоеро тавсиф мекунем, ки мувофиқи он мо мехоҳем ҷудо кунем. Азбаски усули стандартӣ sort()бо ҳамон принсип амалӣ карда мешавад, mySuperSort()дар мисолҳо ман усули стандартиро истифода хоҳам кард sort().
String[] array1 = {"Mother", "soap", "frame"};
String[] array2 = {"I", "Very", "I love", "java"};
String[] array3 = {"world", "work", "May"};

List<String[]> arrays = new ArrayList<>();
arrays.add(array1);
arrays.add(array2);
arrays.add(array3);

Comparator<String[]> sortByLength = new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1.length - o2.length;
    }
};

Comparator<String[]> sortByWordsLength = new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        int length1 = 0;
        int length2 = 0;
        for (String s : o1) {
            length1 += s.length();
        }
        for (String s : o2) {
            length2 += s.length();
        }
        return length1 - length2;
    }
};

arrays.sort(sortByLength);
Натиҷа:
  1. Модар кадрро шуст
  2. сулх Мехнат метавонад
  3. Ман дар ҳақиқат java-ро дӯст медорам
Дар ин ҷо массивҳо аз рӯи шумораи калимаҳо дар ҳар як массив мураттаб карда мешаванд. Массив бо калимаҳои камтар "хурдтар" ҳисобида мешавад. Аз ин рӯ, он дар ибтидо меояд. Он чизе, ки дар он калимаҳо зиёданд, "бештар" ҳисобида мешаванд ва дар охири он анҷом меёбанд. Агар sort()мо муқоисаи дигарро ба метод гузаронем (sortByWordsLength), натиҷа дигар мешавад:
  1. сулх Мехнат метавонад
  2. Модар кадрро шуст
  3. Ман дар ҳақиқат java-ро дӯст медорам
Ҳоло массивҳо аз рӯи шумораи умумии ҳарфҳо дар калимаҳои чунин массив мураттаб карда мешаванд. Дар ҳолати аввал 10 ҳарф, дар дуюм 12 ва дар сеюм 15 ҳарф мавҷуд аст. Агар мо танҳо як муқоисакунандаро истифода барем, он гоҳ мо наметавонем барои он тағирёбандаи алоҳида эҷод кунем, балки an objectи синфи беномро дар росто эҷод кунем. вақти даъват кардани усул sort(). Ҳамин тавр:
String[] array1 = {"Mother", "soap", "frame"};
String[] array2 = {"I", "Very", "I love", "java"};
String[] array3 = {"world", "work", "May"};

List<String[]> arrays = new ArrayList<>();
arrays.add(array1);
arrays.add(array2);
arrays.add(array3);

arrays.sort(new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1.length - o2.length;
    }
});
Натиҷа ҳамон тавре ки дар ҳолати аввал хоҳад буд. Вазифаи 1 . Ин мисолро аз нав нависед, то он массивҳоро на аз рӯи тартиби афзоиши шумораи калимаҳои массив, балки бо тартиби кам ҷудо кунад. Мо аллакай хамаи инро медонем. Мо медонем, ки чӣ гуна an objectҳоро ба усулҳо гузаронем, мо метавонем ин ё он an objectро вобаста ба он чизе, ки дар айни замон ба мо лозим аст, ба усул гузаронем ва дар дохor усуле, ки мо чунин an objectро мегузарем, усуле, ки мо татбиқро барои он навиштем номида мешавад. . Саволе ба миён меояд: ибораҳои лямбда ба он чӣ иртибот доранд? Бо назардошти он, ки ламбда an objectест, ки маҳз як усулро дар бар мегирад. Он ба an objectи метод монанд аст. Усули дар an object печонидашуда. Онҳо танҳо як синтаксиси каме ғайриоддӣ доранд (вале дар ин бора баъдтар). Биёед бори дигар ба ин ворид назар андозем
arrays.sort(new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1.length - o2.length;
    }
});
Дар ин ҷо мо рӯйхати худро мегирем arraysва усули онро меномем sort(), ки дар он an objectи муқоисакунандаро бо як усули ягона мегузарем compare()(барои мо муҳим нест, ки он чӣ ном дорад, зеро он ягона дар ин an object аст, мо онро аз даст намедиҳем). Ин усул ду параметрро мегирад, ки мо бо онҳо дар оянда кор мекунем. Агар шумо дар IntelliJ IDEA кор кунед , шумо эҳтимол дидаед, ки чӣ тавр он ба шумо ин codeро пешниҳод мекунад, то ба таври назаррас кӯтоҳ кунед:
arrays.sort((o1, o2) -> o1.length - o2.length);
Хамин тавр шаш сатр ба як хатти кутох табдил ёфт. 6 сатр ба як сатр аз нав навишта шуд. Чизе нопадид шуд, аммо ман кафолат медиҳам, ки ҳеҷ чизи муҳим аз байн нарафтааст ва ин code маҳз ҳамон тавре ки бо синфи номаълум кор мекунад. Вазифаи 2 . Муайян кунед, ки чӣ гуна ҳалли масъалаи 1-ро бо истифода аз ламбдаҳо аз нав навиштан мумкин аст (ҳамчун чораи охирин, аз IntelliJ IDEA хоҳиш кунед , ки синфи номаълуми худро ба ламбда табдил диҳад).

Биёед дар бораи интерфейсҳо сӯҳбат кунем

Асосан, интерфейс танҳо рӯйхати усулҳои абстрактӣ мебошад. Вақте ки мо синф эҷод мекунем ва мегӯем, ки он як намуди интерфейсро амалӣ хоҳад кард, мо бояд дар синфи худ татбиқи усулҳои дар интерфейс номбаршударо нависем (ё ҳамчун чораи охирин, онро нанависем, балки синфро абстрактӣ гардонем. ). Интерфейсҳо бо усулҳои гуногун мавҷуданд (масалан List), интерфейсҳо бо танҳо як усул мавҷуданд (масалан, ҳамон муқоисакунанда ё иҷрошаванда). Интерфейсҳо умуман бидуни усули ягона мавҷуданд (ба истилоҳ интерфейсҳои маркерӣ, масалан Serializable). Он интерфейсҳое, ки танҳо як усул доранд, инчунин интерфейсҳои функсионалӣ номида мешаванд . Дар Java 8 онҳо ҳатто бо шарҳи махсуси @FunctionalInterface қайд карда шудаанд . Ин интерфейс бо як усули ягонаест, ки барои истифода бо ифодаҳои лямбда мувофиқанд. Тавре ки ман дар боло гуфтам, ифодаи ламбда усулест, ки дар an object печонида шудааст. Ва ҳангоме ки мо чунин an objectро ба ҷое мегузарем, мо дар асл ин як усули ягонаро мегузарем. Маълум мешавад, ки ин усул чӣ ном дорад, барои мо муҳим нест. Ҳамаи он чизе, ки барои мо муҳим аст, параметрҳое мебошанд, ки ин усул мегирад ва дар асл, худи codeи метод. Ифодаи лямбда аслан аст. татбиқи интерфейси функсионалӣ. Дар куҷо мо интерфейсро бо як усул мебинем, ин маънои онро дорад, ки мо метавонем бо истифода аз ламбда чунин синфи беномро дубора нависем. Агар интерфейс аз як усул бештар/камтар дошта бошад, пас ифодаи лямбда ба мо мувофиқат намекунад ва мо синфи беном ё ҳатто як муқаррариро истифода хоҳем бурд. Вакти кофтани ламбдахо расидааст. :)

Синтаксис

Синтаксиси умумӣ чунин аст:
(параметры) -> {тело метода}
Яъне, қавс, дар дохor онҳо параметрҳои метод, як «тирча» (инҳо ду аломат дар як саф мебошанд: минус ва калонтар), ки баъд аз он қисми усул чун ҳамеша дар қавсҳои ҷингила ҷойгир аст. Параметрҳо ба параметрҳое, ки дар интерфейс ҳангоми тавсифи усул нишон дода шудаанд, мувофиқат мекунанд. Агар намуди тағирёбандаҳоро компилятор ба таври возеҳ муайян карда тавонад (дар ҳолати мо маълум аст, ки мо бо массивҳои сатрҳо кор карда истодаем, зеро он Listмаҳз бо массивҳои сатрҳо чоп карда мешавад), он гоҳ намуди тағирёбандаҳо String[]лозим нест. навишта шавад.
Агар шумо боварӣ надошта бошед, навъи онро муайян кунед ва IDEA, агар лозим набошад, онро бо ранги хокистарӣ таъкид мекунад.
Шумо метавонед бештар дар дастури Oracle хонед , масалан. Инро "навсозии ҳадаф" меноманд . Шумо метавонед ҳар гуна номҳоро ба тағирёбандаҳо диҳед, на ҳатман онҳое, ки дар интерфейс нишон дода шудаанд. Агар параметрҳо вуҷуд надошта бошанд, пас танҳо қавс. Агар танҳо як параметр мавҷуд бошад, танҳо номи тағирёбанда бидуни қавс. Мо параметрҳоро ҷудо кардем, ҳоло дар бораи бадани худи ифодаи лямбда. Дар дохor қавсҳои ҷингила, codeро ҳамчун усули муқаррарӣ нависед. Агар тамоми рамзи шумо танҳо аз як сатр иборат бошад, ба шумо лозим нест, ки умуман қавсҳои ҷингила нависед (ба мисли ifs ва ҳалқаҳо). Агар ламбдаи шумо чизе баргардонад, аммо бадани он аз як сатр иборат бошад, returnнавиштан тамоман лозим нест. Аммо агар шумо қавсҳои ҷингила дошта бошед, пас, чунон ки дар усули муқаррарӣ, шумо бояд ба таври возеҳ нависед return.

Мисолхо

Мисол 1.
() -> {}
Варианти соддатарин. Ва аз ҳама бемаънӣ :).Зеро ки ҳеҷ кор намекунад. Мисол 2.
() -> ""
Инчунин як варианти ҷолиб. Он ҳеҷ чизро қабул намекунад ва сатри холиро бармегардонад ( returnҳамчун нолозим партофта шудааст). Ҳамин, аммо бо return:
() -> {
    return "";
}
Мисоли 3. Салом ҷаҳон бо истифода аз ламбдаҳо
() -> System.out.println("Hello world!")
Ҳеҷ чиз намегирад, чизе барнамегардонад (мо returnпеш аз занг гузошта наметавонем System.out.println(), зеро навъи бозгашт дар метод println() — void), танҳо дар экран навиштаҷеро нишон медиҳад. Идеалӣ барои татбиқи интерфейс Runnable. Ҳамон мисол мукаммалтар аст:
public class Main {
    public static void main(String[] args) {
        new Thread(() -> System.out.println("Hello world!")).start();
    }
}
Ё монанди ин:
public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(() -> System.out.println("Hello world!"));
        t.start();
    }
}
Ё мо ҳатто метавонем ифодаи лямбдаро ҳамчун an objectи навъи захира кунем Runnableва сипас онро ба созанда гузаронем thread’а:
public class Main {
    public static void main(String[] args) {
        Runnable runnable = () -> System.out.println("Hello world!");
        Thread t = new Thread(runnable);
        t.start();
    }
}
Биёед ба лаҳзаи захира кардани ифодаи ламбда ба тағирёбанда бодиққат назар кунем. Интерфейс Runnableба мо мегӯяд, ки an objectҳои он бояд метод дошта бошанд public void run(). Мувофиқи интерфейс, усули иҷро чизеро ҳамчун параметр қабул намекунад. Ва он чизе барнамегардонад (void). Аз ин рӯ, ҳангоми навиштани ин роҳ, an object бо кадом усуле сохта мешавад, ки ҳеҷ чизро қабул намекунад ё барнагардонад. Ки бо усули run()интерфейс комилан мувофиқ аст Runnable. Аз ин рӯ, мо тавонистем ин ифодаи лямбдаро ба тағирёбанда ба монанди Runnable. Мисол 4
() -> 42
Боз ҳам, он чизеро қабул намекунад, балки рақами 42-ро бармегардонад. Ин ифодаи лямбда метавонад дар як тағирёбандаи type ҷойгир карда шавад Callable, зеро ин интерфейс танҳо як усулро муайян мекунад, ки чунин менамояд:
V call(),
Vнавъи арзиши бозгашт дар куҷост (дар ҳолати мо int). Мувофиқи он, мо метавонем чунин ифодаи ламбдаро ба таври зерин нигоҳ дорем:
Callable<Integer> c = () -> 42;
Мисоли 5. Ламбда дар чанд сатр
() -> {
    String[] helloWorld = {"Hello", "world!"};
    System.out.println(helloWorld[0]);
    System.out.println(helloWorld[1]);
}
Боз ҳам, ин ифодаи лямбда бе параметрҳо ва навъи бозгашти он аст void(зеро вуҷуд надорад return). Мисол 6
x -> x
Дар ин ҷо мо чизеро ба тағирёбанда мегирем хва онро бармегардонем. Лутфан таваҷҷӯҳ намоед, ки агар танҳо як параметр қабул карда шавад, пас қавсҳои атрофи он навиштан лозим нест. Ҳамин тавр, аммо бо қавс:
(x) -> x
Ва дар ин ҷо вариант бо як возеҳ аст return:
x -> {
    return x;
}
Ё монанди ин, бо қавс ва return:
(x) -> {
    return x;
}
Ё бо ишораи возеҳи намуд (ва мувофиқан, бо қавс):
(int x) -> x
Мисол 7
x -> ++x
Мо онро қабул мекунем хва бармегардонем, аммо барои 1бештар. Шумо инчунин метавонед онро аз нав нависед:
x -> x + 1
Дар ҳарду ҳолат, мо қавсро дар атрофи параметр, ҷисми метод ва калима нишон намедиҳем return, зеро ин шарт нест. Вариантҳо бо қавс ва бозгашт дар мисоли 6 тавсиф шудаанд. Мисоли 8
(x, y) -> x % y
Мо як қисми онро қабул мекунем хва убоқимондаи тақсимро xтавассути y. Дар ин ҷо қавс дар атрофи параметрҳо аллакай талаб карда мешавад. Онҳо танҳо дар сурати мавҷуд будани як параметр ихтиёрӣ мебошанд. Мисли ин бо нишон додани возеҳ намудҳо:
(double x, int y) -> x % y
Мисол 9
(Cat cat, String name, int age) -> {
    cat.setName(name);
    cat.setAge(age);
}
Мо an objectи Cat, сатри дорои ном ва синну соли бутунро қабул мекунем. Дар худи усул, мо ном ва синну соли гузаштаро ба Cat муқаррар кардем. Азбаски тағирёбандаи catмо як навъи истинод аст, an objectи Cat берун аз ифодаи лямбда тағир меёбад (он ном ва синну соли дар дохor он додашударо қабул мекунад). Варианти каме мураккабтаре, ки lambda-и шабеҳро истифода мебарад:
public class Main {
    public static void main(String[] args) {
        // create a cat and print to the screen to make sure it's "blank"
        Cat myCat = new Cat();
        System.out.println(myCat);

        // create lambda
        Settable<Cat> s = (obj, name, age) -> {
            obj.setName(name);
            obj.setAge(age);
        };

        // call the method, to which we pass the cat and the lambda
        changeEntity(myCat, s);
        // display on the screen and see that the state of the cat has changed (has a name and age)
        System.out.println(myCat);
    }

    private static <T extends WithNameAndAge>  void changeEntity(T entity, Settable<T> s) {
        s.set(entity, "Murzik", 3);
    }
}

interface WithNameAndAge {
    void setName(String name);
    void setAge(int age);
}

interface Settable<C extends WithNameAndAge> {
    void set(C entity, String name, int age);
}

class Cat implements WithNameAndAge {
    private String name;
    private int age;

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Натиҷа: Cat{name='null', age=0} Cat{name='Murzik', age=3} Тавре ки мебинед, дар аввал an objectи Cat як ҳолат дошт, аммо пас аз истифодаи ифодаи лямбда, ҳолат тағир ёфт . Ифодаҳои Lambda бо генерикҳо хуб кор мекунанд. Ва агар ба мо лозим ояд, ки синферо эҷод кунем Dog, масалан, он ҳам амалӣ хоҳад кард WithNameAndAge, пас дар усул main()мо метавонем ҳамон амалҳоро бо Dog бидуни тағир додани ифодаи лямбда иҷро кунем. Вазифаи 3 . Интерфейси функсионалӣ бо усуле нависед, ки рақам мегирад ва арзиши мантиқиро бармегардонад. Амалисозии чунин интерфейсро дар шакли ифодаи ламбда нависед, ки trueагар адади додашуда ба 13 бе боқимонда тақсим карда шавад , бармегардад Вазифаи 4 . Интерфейси функсионалӣ бо усуле нависед, ки ду сатрро мегирад ва ҳамон сатрро бармегардонад. Амалисозии чунин интерфейсро дар шакли ламбда нависед, ки сатри дарозтаринро бармегардонад. Вазифаи 5 . Интерфейси функсионалӣ бо усуле нависед, ки се адади касриро қабул мекунад: a, b, cва ҳамон адади касриро бармегардонад. Амалисозии чунин интерфейсро дар шакли ифодаи лямбда нависед, ки дискриминантро бармегардонад. Кй фаромуш кард, Д = б^2 - 4ac . Вазифаи 6 . Бо истифода аз интерфейси функсионалии вазифаи 5, ифодаи ламбда нависед, ки натиҷаи амалиётро бармегардонад a * b^c. Дар бораи ифодаҳои лямбда дар Java маъмул аст. Бо мисолхо ва вазифахо. Қисми 2.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION