SA2

JAVA Stream API (Part I)

Stream API პირველად Java 8-ში გამოჩნდა და შეიძლება ითქვას, რომ  ეს იყო ერთ-ერთი მნიშვნელოვანი დანამატი Lambda Expression-თან ერთად. Stream API-ის მნიშვნელოვანი ასპექტი არის ის, რომ უფრო დახვეწილად განახორციელოს ისეთი ოპერაციები, როგორებიცაა search, map, filter და სხვა. Stream API იყენებს Lambda Expression-ებს, თუმცა ამ პოსტში ამ უკანასკნელს არ განვიხილავთ, გარდა ამისა თეორიულად არ ჩავურღმავდებით ყველაფერს და აქცენტს უფრო მაგალითებზე გავაკეთებთ.

რა არის Stream ? მარტივად რომ ვთქვათ, ეს არის ობიექტების ერთობლიობა. ის ოპერირებს ობიექტებზე, მაგრამ თვითონ არ არის ამ ობიექტების საცავი. Stream API განსაზღვრავს რამდენიმე ინტერფეისს, რომელიც არის java.util.stream პაკეტში. თითოეულ ინტერფეისს აქვს თავისი მეთოდები. აქ დეტალურად ყველას არ მოვიყვანთ. მხოლოდ განვიხილავთ იმ მეთოდებს, რომლებიც შეგვხვდება მაგალითებში. თუმცა უნდა აღინიშნოს ერთი რამ. ინტერფეისების მეთოდები ან არის terminal ან intermediate. Terminal ოპერაციები გამოიყენება რეზულტატის საჩვენებლად, მაგალითად Stream-ში უმცირესი ან უდიდესი ელემენტის პოვნა. როცა ოპერაცია შესრულდება Stream-ზე, ამ Stream-ს მეორედ ვეღარ გამოვიყენებთ. ხოლო intermediate ოპერაციები წარმოქმნიან ახალ Stream-ს.

ამ პოსტში ყურადღებას არ გავამახვილებთ პარალელურ Stream-ებზე. Stream-ის აღება (მიღება) არის ძალიან მარტივი. მაგალითად გვაქვს String-ების მასივი words და გვინდა შესაბამისი Stream, ვიქცევით ასე : Stream<String> wordsStream = Arrays.stream(words);

მემგონი დადგა დრო, რომ განვიხილოთ ერთი მაგალითი ამ ყველაფერზე. ვთქვათ გვაქვს Integer-ების მასივი, ავიღოთ შესაბამისი Stream და ჩავატაროთ გარკვეული ოპერაციები. აღნიშნულ მაგალითში შეგვხვდება ბევრი უცნობი დეტალი და შევეცდები მოკლედ ავხსნა თითოეული.

SA1.PNG

min ფუნქცია აღწერილია შემდეგნაირად Optional<T> min(Comparator<? super T> comp)

შევნიშნოთ, რომ მისი პარამეტრი არის Comparator-ი. ჩვენს განხილულ მაგალითში გამოვიყენეთ Lambda Expression და min-ს პარამეტრად გადავეცით Integer-ის  compare ფუნქციის მიმთითებელი. როგორც ზემოთ ვთქვი, ლამბდა გამოსახულებებს აქ არ განვიხილავთ.

შემდეგი რაც უნდა შევნიშნოთ არის ის, რომ min-ის დასაბრუნებელი ტიპი არის Optional, რომელიც არის generic კლასი java.util პაკეტში. მისი isPresent() მეთოდი გამოიყენება იმის გასარკვევად, არის თუ არა სასურველი ელემენტი წარმოდგენილი (ანუ მასში შენახული არის თუ არა ის ელემენტი, რომელსაც ვეძებდით). დავუშვათ, რომ არის, მაშინ ამ ელემენტის აღება მოხდება get() მეთოდით.

შევნიშნოთ კიდევ ერთი რამ. როგორც აღვნიშნე Stream-ის მეთოდები არის ან terminal ან intermediate. min მეთოდი ისევე როგორც max მეთოდი არის terminal ოპერაცია, ამიტომ მინიმუმის პოვნის შემდეგ ახლიდან ავიღეთ Stream-ი იმავე მასივზე შემდეგი კოდით.

integersStream = integers.stream();

ახლა ცოტა წინ წავიდეთ და ვნახოთ როგორ შეიძლება დავალაგოთ ზემოთ მოყვანილი მასივი Stream-ის გამოყენებით.

SA2.PNG

sorted () მეთოდი არის intermediate ოპერაცია, ამიტომ მისი შედეგი არის ახალი Stream. რაც შეეხება forEach მეთოდს, ის არის Stream-ის მეთოდი და ის აღწერილია შემდეგნაირად :

void forEach(Consumer<? super T> action)

ჩვენ ზემოთ განხილულ მაგალითში მას პარამეტრად გადავეცით Lambda Expression-ი.

მოდით კიდევ წინ წავიდეთ და ვნახოთ როგორ შეგვიძლია მონაცემების გაფილტვრა. მაგალითად  გვინდა  დადებითი კენტი რიცხვები და გვინდა რომ ეს რიცხვები იყოს დალაგებული.

SA3.PNG

filter მეთოდს პარამეტრად გადაეცემა Predicate და გვიბრუნებს ახალ Stream-ს, რომელშიც თითოეული აკლამყოფილებს Predicate-ს თვისებას. ჩვენს შემთხვევაში, ორივე filter-ში გადავეცით Lambda Expression. უნდა აღინიშნოს ისიც, რომ filter არის intermediate ოპერაცია, ანუ აბრუნებს ახალ Stream-ს.

3 thoughts on “JAVA Stream API (Part I)

Leave a Reply / უპასუხე

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / შეცვლა )

Twitter picture

You are commenting using your Twitter account. Log Out / შეცვლა )

Facebook photo

You are commenting using your Facebook account. Log Out / შეცვლა )

Google+ photo

You are commenting using your Google+ account. Log Out / შეცვლა )

Connecting to %s