معادل متد contains در جاوا ۸

جاوا یک زبان برنامه‌نویسیِ شیءگرا است که برای نخستین بار توسط جیمز گاسلینگ در شرکت سان مایکروسیستمز ایجاد گردید. یکی از قابلیت‌های بنیادین جاوا این است که مدیریت حافظه را بطور خودکار انجام می‌دهد. ضریب اطمینان عملکرد برنامه‌های نوشته‌شده به این زبان نسبت به زبانهای نسل اول C بالا است و وابسته به سیستم‌عامل خاصی نیست. فرض کنید یک List یا Set از چند Object داریم و می‌خواهیم بررسی کنیم که آیا یک Object خاص در این List یا Set وجود دارد یا خیر.

راه‌حل اولیه برای این کار استفاده از متد contains است که آن را به صورت زیر به کار می‌بریم:

objects.contains(someObject);

خروجی این متد true یا false است و در نوع‌های داده‌ای primitive خوب عمل می‌کند  ولی متاسفانه بنا به دلایلی مثل یکسان نبودن ترتیب objectها و… در انواع داده‌ای non-primitive بیشتر اوقات مقدار false برمی‌گرداند.

یکی از راه‌حل‌های پیشنهادی برای حل این مشکل استفاده از Lambda Expressions و stream در جاوا ۸ است. برای این منظور می‌توانیم از قطعه کد زیر استفاده کنیم:

 objects.stream().anyMatch(o -> o.getProperty().equals(someObject.getProperty()));

در کد بالا روی مجموعه/لیست مورد نظر یک Stream ایجاد شده و یک property خاص از آن مجموعه/لیست را با property  آن Object مورد نظر ما مقایسه می‌شود و در صورت حداقل یک بار مساوی بودن این دو مقدار، خروجی کد بالا مقدار true خواهد بود.


برچسب‌ها: ، ، ، ، ، ، ،
مرتضی اسدی
مرتضی اسدی

سلام! من مرتضی اسدی هستم، یک توسعه‌دهنده‌ی نرم‌افزار و در این وبلاگ دست‌نوشته‌هایم را می‌نویسم.

نظرات


مهدی تاجیک

به نظرم متن آموزش می تونه کمی بلند تر باشه و مفید تر باشه واقعاً آموزش اتفاق بیافتد. مثلا در اینجا توضیح دهید که steam چیست و کارش چیت، map چیست و نحوه کار را چند مثال بزنید. با تشکر

مرتضی اسدی

ضمن تشکر از شما، باید بگویم توضیح دادن Stream کمی سخت است، Stream یک interface است که بیشتر در lambda expressionها کاربرد دارد. Stream با collection (مثل List یا Set) تفاوت‌هایی دارد از جمله اینکه:

  • Stream یک data structure نیست که عناصر را ذخیره کند.
  • عملیات روی Stream خروجی تولید می‌کند؛ اما منبع (source) اصلی را تغییر نمی‌دهد.
  • بسیاری از عملیات روی Strem مانند (filtering، mapping، و duplicate) قابلیت این را دارند که به صورت lazy پیاده‌سازی شوند.
  • یک Collection اندازه محدود دارد ولی stream نه.
  • در طی حیات یک Stream، عناصر آن فقط یکبار visit‌ می‌شوند.
اگر علاقمندید بیشتر بخوانید؛ نگاهی به مستندات رسمی بیندازید.
در خصوص map نیز باید یدانید یکی از عملیاتی که روی Streamها تعریف می‌شود، map است و یک قسمت از مدل برنامه‌نویسی Map-Reduce است که (به طور خلاصه) داده‌ها را به قسمت‌های مجزا شکسته (map می‌کند) و پس محاسبات بر روی قسمت‌های مجزا و گرفتن خروجی، با تجمیع خروجی‌ها (reduce) نتیجه کل را حساب می‌کند.

احمد

سلام. در این مثال از تابع flatMap هم میتوان استفاده کرد.

public boolean matches(Collection parentObjects, Object anObject) { return parentObjects.stream().flatMap(p -> p.getChildren().stream()).anyMatch(c -> c.getProperty().equals(anObject)); }

مرتضی اسدی

با سلام و درود، flatMap هم یکی از عملیات روی Stream است و نظر شما کاملا درست است.