Անցում ամսաթվերի միջով՝ օգտագործելով Կոտլինի միջակայքի արտահայտությունները
Որպեսզի շարահյուսությունը ցիկլային կրկնության և վերահսկման հոսքի հայտարարությունների համար անվտանգ և բնական ընթերցման համար դարձնի, Կոտլինի ստանդարտ գրադարանը տրամադրում է տիրույթի հայեցակարգը: Այս գրառման մեջ մենք պատրաստվում ենք ուսումնասիրել, թե ինչպես օգտագործել տիրույթի արտահայտությունները գործողության մեջ: Նախ, մենք պատրաստվում ենք բացահայտել ներկառուցված տիրույթի իրականացում այնպիսի ինտեգրալ տեսակների համար, ինչպիսիք են Char
, Int
կամ Long
: Հաջորդը, մենք պատրաստվում ենք իրականացնել սովորական առաջընթաց LocalDate
դասի համար: Եկեք սկսենք 🚀!
Կրկնվող պրիմիտիվ տեսակների միջոցով
Շրջանակի գաղափարն ինքնին կարող է դիտվել որպես վերացական տվյալների տեսակ, որը մոդելավորում է արժեքների փակ շրջանակ կամ օբյեկտների մի շարք, որոնք կարող են կրկնվել հակիրճ ձևով: kotlin.ranges փաթեթից ինտերֆեյսը, որը կոչվում է ClosedRange
, բազային հռչակագիր է, որը մոդելավորում է տիրույթի գաղափարը: Այն պահում է բռնիչը տիրույթի առաջին և վերջին տարրերին, ինչպես նաև տրամադրում է contains(value: T): Boolean
և isEmpty(): Boolean
ֆունկցիաները, որոնք ստուգում են երկու պայման՝ արդյոք տվյալ արժեքը պատկանում է տիրույթին և եթե տիրույթը դատարկ է: Գոյություն ունեն ներկառուցված ընդգրկույթներ ինտեգրալ պարզունակ տեսակների համար, ինչպիսիք են Int
, Long
և Char
: Պարզունակ տիպի միջակայք սահմանելու համար մենք օգտագործում ենք rangeTo()
ֆունկցիան: Եկեք նայենք հետևյալ օրինակին 👇🏽.
Վերևի հայտարարությունը սահմանում է 0-ից մինչև 1000 արժեքների ամբողջ թվերի տիրույթ: rangeTo()
ֆունկցիան ունի նաև իր սեփական օպերատորը ..
համարժեքը, որը թույլ է տալիս ընդգրկույթը հայտարարել ավելի բնական եղանակով 🦊:
Կափարիչի տակ IntRange
իրականացումը պարունակում է IntProgression
class, որն ապահովում է Iterator ինտերֆեյսի իրականացումը, որն անհրաժեշտ է կրկնության համար: Ահա for ցիկլով ամբողջ թվերի առաջընթացն օգտագործելու օրինակ.
Վերը նշված կոդը գործարկելու արդյունքում մենք կստանանք հետևյալ արժեքները, որոնք տպագրվում են վահանակում.
0
100
200
…
1000
Մենք կարող ենք նաև նույն արդյունքին հասնել՝ իրականացնելով կրկնությունը՝ օգտագործելով while օղակը ավելի հրամայական եղանակով (բայց մենք ապրում ենք 21-րդ դարում և չենք անի 😛):
Անցում ոչ պարզունակ տեսակների միջով
Պարզվում է, որ նաև բավականին հեշտ է իրականացնել մաքսային առաջընթաց ցանկացած տեսակի համար, որն իրականացնում է Comparable
ինտերֆեյսը: Այս մասում մենք կուսումնասիրենք, թե ինչպես ստեղծել LocalDate
տիպի օբյեկտների առաջընթաց և կբացահայտենք, թե ինչպես կարելի է անցնել ամսաթվերը հեշտ ճանապարհով:
Այս առաջադրանքն իրականացնելու համար, նախ, մենք պետք է ծանոթանանք ClosedRange
և Iterator
ինտերֆեյսերին: Մենք պետք է դրանք իրականացնենք, որպեսզի հայտարարենք առաջընթաց LocalDate
տեսակի համար:
ClosedRange
ինտերֆեյսը բացահայտում է տիրույթի նվազագույն և առավելագույն արժեքները: Այն նաև տրամադրում է contains(value: T): Boolean
և isEmpty(): Boolean
գործառույթների իրականացումը, որը ստուգում է՝ արդյոք տվյալ արժեքը պատկանում է տիրույթին և արդյոք տիրույթը դատարկ է: Մյուս կողմից, Iterator
ինտերֆեյսը պարզապես տեղեկատվություն է տրամադրում հաջորդ արժեքի և դրա հասանելիության մասին՝ հետևյալ կերպ.
Սկսենք Iterator
օրինակի ներդրումից LocalDate
տեսակի համար: Մենք պատրաստվում ենք ստեղծել մաքսային դաս, որը կոչվում է DateIterator
, որն իրականացնում է Iterator<LocalDate>
ինտերֆեյսը:
DateIterator
դասն ունի 3 հատկություն՝currentDate
, endDateInclusive
և stepDays
: next()
ֆունկցիայի ներսում մենք վերադարձնում ենք currentDate
արժեքը և այն թարմացնում ենք ամսաթվի արժեքին՝ օգտագործելով տրված stepDays
հատկության միջակայքը:
Հիմա եկեք առաջ շարժվենք և իրականացնենք առաջընթացը LocalDate
տիպի համար: Մենք պատրաստվում ենք ստեղծել նոր դաս, որը կոչվում է DateProgression
, որը կիրականացնի Iterable<LocalDate>
և ClosedRange<LocalDate>
ինտերֆեյսը:
DateProgression
դասը միաձուլում է գործառույթները, որոնք հայտարարված են և՛ Iterable<LocalDate>
, և՛ ClosedRange<LocalDate>
միջերեսներով: Կրկնումը թույլ տալու համար մենք պետք է տրամադրենք DateIterator
դասի օրինակ՝ որպես Iterable
ինտերֆեյսի պահանջվող Iterator արժեք: Մենք նաև պետք է անտեսենք ClosedRange
ինտերֆեյսի start
և endInclusive
հատկությունները անմիջապես կոնստրուկտորում: Կա նաև stepDays
հատկություն՝ նշանակված 1 լռելյայն արժեքով: Ինչպես տեսնում եք, ամեն անգամ, երբ մենք կանչում ենք քայլ ֆունկցիան, ստեղծվում է DateProgression
դասի նոր օրինակ:
Վերջին քայլը, որն անհրաժեշտ է LocalDate
տեսակը տիրույթի արտահայտման համար օգտագործելու համար, LocalDate
դասի համար սովորական rangeTo
օպերատորի հայտարարումն է:
վերջ 🎊Այժմ մենք կարող ենք աշխատել LocalDate
տիպի հետ՝ օգտագործելով միջակայքի արտահայտությունները: Տեսնենք, թե ինչպես օգտագործել մեր իրականացումը գործողության մեջ: Ստորև բերված օրինակում մենք կօգտագործենք մեր rangeTo
օպերատորի հայտարարագիրը՝ կրկնելու համար տրված ամսաթվերի միջակայքը.
Արդյունքում, վերը նշված օրինակի կոդի տողերը կտպեն հաջորդ ամսաթվերը մեկ շաբաթ տևողությամբ, հետևյալ կերպ.
Չորեքշաբթի 2020–01–01
Չորեքշաբթի 2020–01–08
…
Չորեքշաբթի 2020–12–30
Կա ավելին…
DateProgression
դասի իրականացման շնորհիվ մեզ հաջողվել է հասնել LocalDate
օրինակների միջոցով կրկնելու արդյունավետ միջոցի: Բայց սա դեռ ամենը չէ: Մեր ներդրումն ապահովում է LocalDate
օբյեկտների միջակայքերը օգտագործելու կոկիկ եղանակ՝ հոսքի վերահսկման պայմաններում, ինչպիսիք են.
Kotlin-ի մեկ այլ հզոր հատկանիշ, որը մենք օգտագործել ենք LocalDate
կրկնության օրինակում, օպերատորի գերբեռնման հնարավորությունն է: Այն թույլ է տալիս ֆունկցիաների կանչերը փոխարինել հակիրճ շարահյուսությամբ և օգնում է գրել կոդ, որն ավելի քիչ կաթսա է և միաժամանակ կարդալը բնական է 😀:
Կոտլինը բացատրեց
Kotlin Explained շարքի հոդվածները կենտրոնացած են Կոտլին լեզվի առանձնահատկությունների և հասկացությունների վրա, որոնք ամենօրյա ծրագրավորումն օգտակար են դարձնում:
Կա՞ որևէ կոնկրետ բան, որը կցանկանայիք կարդալ Kotlin Explained շարքում: Գրեք ձեր գաղափարը մեկնաբանություններում և մնացեք հետևում:
Եթե այս հոդվածը ձեզ օգտակար է համարել, ապա դրսևորեք ձեր սերը՝ սեղմելով ձախ կողմում գտնվող մի քանի ծափ 👏։ Այս կերպ դուք կարող եք տեղեկացնել ինձ, որ իմ աշխատանքը կարևոր է ձեզ համար: Այն դրդում է ավելին գրել: Եվ մի մոռացեք հետևել kotlin-arsenal հրապարակմանը արդի լինելու համար: Շնորհակալություն