আমি জাভা স্ট্রিমগুলি সম্পর্কে পড়ছি এবং আমি পাশাপাশি যাচ্ছি নতুন জিনিসগুলি আবিষ্কার করছি। আমি যে নতুন জিনিস পেয়েছি তার মধ্যে একটি হল peek()
ফাংশন। আমি উঁকি মেরে পড়া প্রায় সমস্ত কিছুই বলে এটি আপনার স্ট্রিমগুলি ডিবাগ করার জন্য ব্যবহার করা উচিত।
যদি আমার স্ট্রিম থাকে যেখানে প্রতিটি অ্যাকাউন্টের একটি ব্যবহারকারীর নাম, পাসওয়ার্ড ক্ষেত্র এবং একটি লগইন () এবং লগইন ইন () পদ্ধতি থাকে।
আমারও আছে
Consumer<Account> login = account -> account.login();
এবং
Predicate<Account> loggedIn = account -> account.loggedIn();
কেন এত খারাপ হবে?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
এখন যতদূর আমি এটি বলতে পারি এটি করার উদ্দেশ্যে ঠিক কী করে। এটা তোলে;
- অ্যাকাউন্টগুলির একটি তালিকা নেয়
- প্রতিটি অ্যাকাউন্টে লগ ইন করার চেষ্টা করে
- লগ ইন নেই এমন কোনও অ্যাকাউন্ট ফিল্টার করে
- লগ ইন করা অ্যাকাউন্টগুলি একটি নতুন তালিকায় সংগ্রহ করে
এরকম কিছু করার ক্ষতি কি? কোন কারণেই আমার এগিয়ে যাওয়া উচিত নয়? সবশেষে, যদি এই সমাধান না হয় তবে কী?
এর মূল সংস্করণটি। ফিল্টার () পদ্ধতিটি নীচে ব্যবহার করেছে;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
আপনি যে অপারেশনটির বিপরীতে চান তা হতে পারে peek
। এটি এপিআই-তে রয়েছে বলেই এর অর্থ এটি অপব্যবহারের জন্য উন্মুক্ত নয় (যেমন Optional.of
)।
.peek(Account::login)
এবং হতে পারে .filter(Account::loggedIn)
; কোনও গ্রাহক এবং ভবিষ্যদ্বাণী লেখার কোনও কারণ নেই যা কেবল এই জাতীয় পদ্ধতিটিকে কল করে।
forEach()
এবং peek()
কেবলমাত্র পার্শ্ব-প্রতিক্রিয়া দ্বারা পরিচালিত হতে পারে; এগুলি যত্ন সহকারে ব্যবহার করা উচিত। "। আমার মন্তব্য আরো মনে করিয়ে দিতে ছিল peek
অপারেশন (যা ডিবাগ উদ্দেশ্যে জন্য ডিজাইন করা হয়েছে) মত অন্য অপারেশন ভিতরে একই জিনিস করছেন দ্বারা প্রতিস্থাপিত করা উচিত নয় map()
বা filter()
।