ماڈیول اسباق (2/2)
اسٹریم API
جاوا میں اسٹریم API آپ کو فنکشنل پروگرامنگ کا فائدہ اٹھاتے ہوئے، اعلانیہ انداز میں اشیاء کے مجموعوں پر کارروائی کرنے کی اجازت دیتا ہے۔ ایک سلسلہ ڈیٹا کو ذخیرہ نہیں کرتا ہے، لیکن اس کے بجائے آپریشنز کی پائپ لائن کے ذریعے ماخذ (جیسے فہرست یا صف) سے عناصر لے جاتا ہے۔
ایک سٹریم پائپ لائن تین حصوں پر مشتمل ہے:
- ایک ذریعہ (جیسے،
list.stream()) - صفر یا اس سے زیادہ انٹرمیڈیٹ آپریشن (جو ایک نیا سلسلہ واپس کرتے ہیں، جیسے،
filter،map) - ایک ٹرمینل آپریشن (جو ایک حتمی نتیجہ یا ضمنی اثر پیدا کرتا ہے اور سٹریم کو بند کرتا ہے، جیسے،
collect،forEach،reduce)
کامن انٹرمیڈیٹ آپریشنز
انٹرمیڈیٹ آپریشنز سست ہیں: انہیں اس وقت تک انجام نہیں دیا جاتا جب تک کہ ٹرمینل آپریشن شروع نہ کیا جائے۔
filter(Predicate): بولین حالت کی بنیاد پر عناصر کو فلٹر کرتا ہے۔map(Function): فنکشن کو لاگو کر کے ہر عنصر کو کسی اور چیز میں تبدیل کرتا ہے۔sorted(): اسٹریم کے عناصر کو ترتیب دیتا ہے۔
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"کامن ٹرمینل آپریشنز
forEach(Consumer): سٹریم کے ہر عنصر کے لیے ایک ایکشن کرتا ہے۔collect(Collector): سلسلہ کے نتائج کو ایک کنٹینر میں جمع کرتا ہے (مثال کے طور پر،Collectors.toList()استعمال کرنے والی فہرست)۔reduce(identity, BinaryOperator): اسٹریم عناصر کو ایک واحد مجموعی قدر میں جوڑتا ہے۔
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10خود ہی آزمائیں۔
نمبروں کے سلسلے کا استعمال کرتے ہوئے کوڈ کو مکمل کریں تاکہ صرف یکساں نمبروں کو فلٹر کریں، انہیں ایونز نام کی ایک نئی فہرست میں جمع کریں، اور System.out.println کا استعمال کرتے ہوئے اسے پرنٹ کریں۔
اشارہ دکھائیں۔
`numbers.stream()` کال کرکے شروع کریں، `.filter(n -> n % 2 == 0)` شامل کریں، اور آخر میں `.collect(Collectors.toList())` کے ساتھ جمع کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
نقشہ کا استعمال کرتے ہوئے ناموں کی فہرست کے اندر موجود تمام ناموں کو بڑے حروف میں تبدیل کرنے کے لیے اسٹریمز کا استعمال کریں، اور طریقہ کے حوالے سے forEach کا استعمال کرتے ہوئے ایک ایک کرکے پرنٹ کریں۔
اشارہ دکھائیں۔
`.map(s -> s.toUpperCase())` کے بعد ٹرمینل آپریشن `.forEach(System.out::println)` استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
سٹریم کا استعمال کرتے ہوئے نمبروں کی فہرست میں موجود تمام نمبروں کے مجموعے کا حساب لگا کر کوڈ کو مکمل کریں اور 0 کی ابتدائی قیمت کے ساتھ کم ٹرمینل آپریشن۔ رقم پرنٹ کریں۔
اشارہ دکھائیں۔
`numbers.stream().reduce(0, (a, b) -> a + b)` استعمال کریں اور نتیجے میں آنے والے متغیر کو پرنٹ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔