Java - Lambda Expressions PlatoBlockchain Data Intelligence کے ساتھ ایک سٹریم کو فلٹر کریں۔ عمودی تلاش۔ عی

جاوا - لیمبڈا اظہار کے ساتھ ایک سلسلہ کو فلٹر کریں۔

جاوا اسٹریمز کو جاوا 8 میں 2014 میں مکمل طور پر متعارف کرایا گیا ہے، ایک فنکشنل پروگرامنگ پیراڈیم میں وربوز جاوا کو متعارف کرانے کی کوشش میں۔ جاوا اسٹریمز ون لائنرز میں کلیکشن پروسیسنگ انجام دینے کے لیے بہت سے لچکدار اور طاقتور فنکشنل آپریشنز کو بے نقاب کرتے ہیں۔

کچھ پیشین گوئی پر مبنی مجموعوں کو فلٹر کرنا عام طور پر استعمال ہونے والے فنکشنل آپریشنز میں سے ایک ہے، اور اس کے ساتھ انجام دیا جا سکتا ہے۔ Predicate یا زیادہ اختصار کے ساتھ – a کے ساتھ لیمبڈا اظہار.

اس مختصر گائیڈ میں، ہم اس پر ایک نظر ڈالیں گے کہ آپ لیمبڈا ایکسپریشنز کے ساتھ جاوا 8 اسٹریم کو کیسے فلٹر کرسکتے ہیں۔

جاوا میں اسٹریمز کو فلٹر کرنا

عام طور پر، کوئی بھی Stream کے ذریعے فلٹر کیا جا سکتا ہے۔ filter() طریقہ، اور دی گئی پیش گوئی:

Stream filter(Predicate<? super T> predicate)

سٹریم میں ہر عنصر پیش گوئی کے خلاف چلایا جاتا ہے، اور اگر پیشین گوئی واپس آتی ہے تو اسے آؤٹ پٹ سٹریم میں شامل کر دیا جاتا ہے۔ true. آپ فراہم کر سکتے ہیں a Predicate مثال:

Predicate contains = s -> s.contains("_deprecated");
List results = stream.filter(contains).collect(Collectors.toList());

یا، لیمبڈا ایکسپریشن فراہم کرکے اسے آسان بنائیں:

List results = stream.filter(s -> s.contains("_deprecated"))
                             .collect(Collectors.toList());

یا یہاں تک کہ لیمبڈا اظہار کو a میں سمٹ دیں۔ طریقہ حوالہ:


List results = stream.filter(String::isEmpty)
                             .collect(Collectors.toList());

طریقہ کار کے حوالہ جات کے ساتھ، آپ دلائل کو پاس نہیں کر سکتے، اگرچہ، آپ جس چیز کو فلٹر کر رہے ہیں اس میں طریقوں کی وضاحت کر سکتے ہیں اور انہیں آسانی سے فلٹر کرنے کے لیے تیار کر سکتے ہیں (جب تک کہ طریقہ دلائل کو قبول نہیں کرتا ہے اور ایک boolean).

یاد رکھیں کہ سلسلے جمع نہیں ہیں۔ - وہ نہریں ہیں۔ مجموعوں کی، اور آپ کو انہیں واپس کسی بھی مجموعہ میں جمع کرنا پڑے گا جیسے کہ a List, Mapوغیرہ ان کو مستقل کرنے کے لیے۔ مزید برآں، تمام آپریشنز سٹریم عناصر پر کیے جاتے ہیں۔ انٹرمیڈیٹ or ٹرمینل:

  • انٹرمیڈیٹ آپریشنز پچھلے آپریشن کی تبدیلیوں کے ساتھ ایک نیا سلسلہ واپس کرتے ہیں۔
  • ٹرمینل آپریشنز ڈیٹا کی قسم کو لوٹاتے ہیں اور اس کا مقصد کسی ندی پر پروسیسنگ کی پائپ لائن کو ختم کرنا ہوتا ہے۔

filter() ہے ایک انٹرمیڈیٹ آپریشن، اور اس کا مقصد دیگر انٹرمیڈیٹ آپریشنز کے ساتھ زنجیروں میں جکڑا جانا ہے، اس سے پہلے کہ اس سلسلے کو ختم کیا جائے۔ کسی بھی تبدیلی کو برقرار رکھنے کے لیے (جیسے خود عناصر میں تبدیلیاں، یا فلٹر شدہ نتائج)، آپ کو نتیجہ تفویض کرنا ہوگا آؤٹ پٹ سٹریم ٹرمینل آپریشن کے ذریعے ایک نئے حوالہ متغیر کی طرف۔

نوٹ: یہاں تک کہ جب بہت سے لیمبڈا ایکسپریشنز کو زنجیر بناتے ہوئے، آپ مناسب لائن بریک کے ساتھ پڑھنے کے قابل مسائل میں نہیں پڑ سکتے۔

درج ذیل مثالوں میں، ہم کتابوں کی اس فہرست کے ساتھ کام کریں گے:

Book book1 = new Book("001", "Our Mathematical Universe", "Max Tegmark", 432, 2014);
Book book2 = new Book("002", "Life 3.0", "Max Tegmark", 280, 2017);
Book book3 = new Book("003", "Sapiens", "Yuval Noah Harari", 443, 2011);
        
List books = Arrays.asList(book1, book2, book3);

Stream.filter() کے ساتھ فلٹر کلیکشن

آئیے کتابوں کے اس مجموعے کو فلٹر کریں۔ کوئی بھی پیش گوئی جاتی ہے - تو آئیے مثال کے طور پر فلٹر کریں جس کے ذریعے کتابوں کے 400 سے زیادہ صفحات ہیں:

List results = books.stream()
                          .filter(b -> b.getPageNumber() > 400)
                          .collect(Collectors.toList());

اس کے نتیجے میں ایک فہرست ہے جس میں شامل ہیں:

[
Book{id='001', name='Our Mathematical Universe', author='Max Tegmark', pageNumber=432, publishedYear=2014}, 
Book{id='003', name='Sapiens', author='Yuval Noah Harari', pageNumber=443, publishedYear=2011}
]

فلٹر کرتے وقت، زنجیر بنانے کا ایک واقعی مفید طریقہ ہے۔ map()، جو آپ کو اشیاء کو کسی اور قدر سے نقشہ کرنے دیتا ہے۔ مثال کے طور پر، ہم ہر کتاب کو اس کے نام سے نقشہ بنا سکتے ہیں، اور اس طرح صرف واپس کر سکتے ہیں۔ نام ان کتابوں میں سے جو کی پیش گوئی کے مطابق ہیں۔ filter() کال:

List results = books.stream()
                            .filter(b -> b.getPageNumber() > 400)
                            .map(Book::getName)
                            .collect(Collectors.toList());

اس کے نتیجے میں تاروں کی فہرست ہوتی ہے:

[Our Mathematical Universe, Sapiens]

Stream.filter() کے ساتھ ایک سے زیادہ پیشین گوئیوں پر فلٹر کلیکشن

عام طور پر، ہم مجموعوں کو ایک سے زیادہ معیار کے مطابق فلٹر کرنا چاہتے ہیں۔ یہ ایک سے زیادہ زنجیروں کی طرف سے کیا جا سکتا ہے filter() کالز or شارٹ سرکٹ پریڈیکیٹ کا استعمال کرتے ہوئے، جو ایک ہی میں دو شرائط کو چیک کرتا ہے۔ filter() کال کریں۔

 List results = books.stream()
                    .filter(b -> b.getPageNumber() > 400 && b.getName().length() > 10)
                    .collect(Collectors.toList());
                    


 List results2 = books.stream()
                    .filter(b -> b.getPageNumber() > 400)
                    .filter(b -> b.getName().length() > 10)
                    .collect(Collectors.toList());

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

متعدد معیارات کو استعمال کرتے وقت - لیمبڈا کالز کچھ لمبی ہو سکتی ہیں۔ اس مقام پر، ان کو الگ الگ پیشین گوئی کے طور پر نکالنا زیادہ وضاحت پیش کر سکتا ہے۔ اگرچہ، کون سا نقطہ نظر تیز ہے؟

پیچیدہ حالت یا ایک سے زیادہ فلٹرز کے ساتھ سنگل فلٹر؟

یہ آپ کے ہارڈ ویئر پر منحصر ہے، آپ کا مجموعہ کتنا بڑا ہے، اور آیا آپ متوازی سلسلے استعمال کرتے ہیں یا نہیں۔ عام طور پر - ایک پیچیدہ حالت کے ساتھ ایک فلٹر آسان حالات (چھوٹے سے درمیانے درجے کے مجموعے) کے ساتھ متعدد فلٹرز کو پیچھے چھوڑ دے گا، یا اسی سطح پر کارکردگی کا مظاہرہ کرے گا (بہت بڑے مجموعے)۔ اگر آپ کی شرائط بہت طویل ہیں - آپ انہیں متعدد پر تقسیم کرنے سے فائدہ اٹھا سکتے ہیں۔ filter() کالز، بہتر پڑھنے کی اہلیت کے لیے، کیونکہ کارکردگی بہت ملتی جلتی ہے۔

بہترین انتخاب دونوں کو آزمانا ہے، پر کارکردگی کو نوٹ کریں۔ ہدف آلہ، اور اس کے مطابق اپنی حکمت عملی کو ایڈجسٹ کریں۔

GitHub صارف volkodavs تھرو پٹ آپریشنز/s میں فلٹرنگ بینچ مارک کیا، اور نتائج کی میزبانی کی۔ "javafilters-benchmarks" ذخیرہ نتائج کا خلاصہ معلوماتی جدول میں کیا گیا ہے:

یہ بڑے مجموعہ کے سائز پر واپسی کی واضح کمی کو ظاہر کرتا ہے، دونوں نقطہ نظر ایک ہی سطح کے ارد گرد کارکردگی کا مظاہرہ کر رہے ہیں۔ متوازی سلسلے بڑے مجموعہ کے سائز پر نمایاں طور پر فائدہ اٹھاتے ہیں، لیکن چھوٹے سائز (~10k عناصر سے نیچے) پر کارکردگی کو روکتے ہیں۔ یہ بات قابل غور ہے کہ متوازی اسٹریمز نے اپنے تھرو پٹ کو غیر متوازی اسٹریمز کے مقابلے میں بہت بہتر رکھا ہے، جس سے وہ ان پٹ کے لیے نمایاں طور پر زیادہ مضبوط ہیں۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse