নতুন জাভা 8 স্ট্রিমগুলি এপিআই ব্যবহার করার সময় কোনও সংকলনের একটি নির্দিষ্ট উপাদান খুঁজতে, আমি এই জাতীয় কোড লিখি:
String theFirstString = myCollection.stream()
.findFirst()
.get();
এখানে ইন্টেলিজি সতর্ক করে যে পেতে () প্রথমে ইস্প্রেস () পরীক্ষা না করে কল করা হয়।
তবে, এই কোড:
String theFirstString = myCollection.iterator().next();
... কোন সতর্কতা দেয়।
এই দুটি কৌশলগুলির মধ্যে কি কিছু গভীর পার্থক্য রয়েছে, যা স্ট্রিমিং পদ্ধতির কোনও উপায়ে আরও "বিপজ্জনক" করে তোলে, ইজপ্রেসেট () কে প্রথমে কল না করে কখনই গেট () কল করা গুরুত্বপূর্ণ নয়? চারদিকে গুগল করা, আমি প্রোগ্রামাররা কীভাবে ptionচ্ছিক <> সাথে অসাবধান এবং সেগুলি () কখনই কল করতে পারে কল্পনা করতে পারে সে সম্পর্কে কথা বলার জন্য নিবন্ধগুলি পেয়েছি।
কথাটি হ'ল, আমার কোডটি বগি যেখানে রয়েছে তার কাছে যতটা সম্ভব আমার কাছে নিক্ষিপ্ত একটি ব্যতিক্রম পেতে চাই, যা কোনও উপাদান না পাওয়া গেলে এই ক্ষেত্রে আমি get () কল করছি। আমি চাই না যেমন অনর্থক রচনা লিখতে:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... যদি না পেয়ে () থেকে ব্যতিক্রমকে উস্কে দেওয়ার কিছু বিপদ না থাকে যা সম্পর্কে আমি অজানা?
কার্ল বিলেফেল্টের প্রতিক্রিয়া এবং হাল্কের মন্তব্য পড়ার পরে আমি বুঝতে পারলাম উপরে আমার ব্যতিক্রম কোডটি কিছুটা আনাড়ি, এখানে আরও ভাল কিছু:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
এটি আরও দরকারী বলে মনে হচ্ছে এবং সম্ভবত এটি অনেক জায়গায় প্রাকৃতিক আসবে। আমি এখনও অনুভব করছি যে আমি এই সমস্তগুলির সাথে কাজ না করেই তালিকা থেকে একটি উপাদান বাছাই করতে সক্ষম হব, তবে এটি এমন হতে পারে যে আমাকে এই ধরণের নির্মাণের অভ্যস্ত হওয়া দরকার।