JavaRush /Java блогу /Random-KY /Ламбдалар жана агымдар, бир гана практика, теория жок

Ламбдалар жана агымдар, бир гана практика, теория жок

Группада жарыяланган
Баарына салам. Мелдешке байланыштуу бул жерге макала эмес, кыскача сабак жазууну чечтим. Бул Javaдагы ламбдалар жана агымдар жөнүндө болмокчу. Эгер сиз буга чейин тааныш болсоңуз жана аларды колдонсоңуз, анда түз эле макаланын аягына өтүңүз, JavaRush менен сиз машыга турган тапшырмалардын чакан тандоосу болот. Сизге java 8 жана андан жогору, JRден тренинг керек, майда-чүйдөсүнө чейин аз жана түшүнүксүз нерселер көп болот, аны түшүнүүгө күчтүү каалоо. Келгиле, мен ламбдалардын жана агындардын пайда болуу тарыхын түшүндүрбөйм, мен аны өзүм билбейм. Мен алардын функционалдык программалоо стorнен, биздин OOP стorбизге келгенин гана билем. Кыскача үйрөнүү тажрыйбамда мен жөн гана кантип жана эмнени көрсөттүм, кээ бирөөлөргө идеяны түшүнүү кыйынга турат, андыктан кантип жазууну унутпаңыз, кийинчерээк түшүнөсүз.

Lambdas

Ламбдалар жана агымдар, практика гана, теория жок - 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 сап кошуу керек, жок дегенде бирөөнү сунуштасам, калганы автоматтык түрдө жазылат. Кааласаңыз, мисалдарды гуглдан карап, түшүнүүгө аракет кылсаңыз болот. Албетте озунузду текшересиз, алдасаныз эч ким билбейт, анан эмнеге? Ушундай жөнөкөй маселени чечкенден кийин, менин 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 кайтаруу менен чечorши мүмкүн, б.а. методдун денеси менен башталат returnжана андан кийин 1 бүтүндөй агым болот. Келгиле, талапты жокко чыгаралы StringBuilder.

  • 1908 - 1 агым жана 1 кайтаруу менен да чече аласыз. Файлды окуу менен башталат. Мен агым аркылуу файлга кантип жаздырууну билбейм (эгерде бул мүмкүн болсо), биз аны кол менен жасайбыз. Ошол. Биз болгону 2 агымды ачабыз (консоль жана файлга жазуу). Биз файлды бизге барак же агым (google жана javadoc) кайтара турган ыкмалар аркылуу окуйбуз.

  • 1907 - теория боюнча, ошондой эле бир агым менен чечorши мүмкүн. Агымга киргизүү файлдын аталышы, чыгаруу - дүйнөдөгү сөздөрдүн саны.

Баары болду. Мүмкүн болсо, дагы бир жөнөкөй окуяны жазам. Менин оюмча, сынап көрүү мүмкүнчүлүгү жок сонун нерсе жөнүндө окуу кандайдыр бир кызыксыз же башка нерсе. Ал эми эсептегичтен жана 3 табышмактан кийин, менимче, сиз лямбдалар жана агымдар менен жакшы тил табышып жатасыз, андыктан ансыз деле жок болсоңуз, бардык мүмкүнчүлүктөр жөнүндө окуп чыгыңыз. UPD:
  • 1016 - бир аз бурмаланган жол менен, аны 1 агым жана 1 кайтаруу менен чече аласыз;

  • 1821 - абдан жеңил жана 1 агым жана 1 кайтып.

    Бул 2 тапшырма сизди башка агым ыкмасы жана башка коллекционер менен тааныштырат.

  • 1925 - бир агымда сөздөрү бар сапты алып, анан аны файлга жаза аласыз (агымдан файлга жазуу мүмкүнбү, жокпу билбейм)

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION