প্রথমে উভয় পদ্ধতির ঘোষণাটি পরীক্ষা করে দেখুন।
1) অরলিজ: যুক্তি কার্যকর করুন এবং যুক্তি হিসাবে ফলাফল পাস করুন।
public T orElse(T other) {
return value != null ? value : other;
}
2) অরেলসগেট: alচ্ছিকের ভিতরে মানটি যদি শূন্য থাকে তবে যুক্তি সম্পাদন করুন
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
উপরোক্ত ঘোষণার উপর কিছু ব্যাখ্যা:
"Oচ্ছিক.অরলিজ" যুক্তিটি সর্বদা optionচ্ছিকভাবে (শূন্য, খালি বা মান সহ) অবজেক্টের মান নির্বিশেষে কার্যকর করা হয়। "Optional.orElse" ব্যবহার করার সময় সর্বদা উপরে বর্ণিত বিষয়টি বিবেচনা করুন, অন্যথায় "Optional.orElse" ব্যবহার নিম্নলিখিত পরিস্থিতিতে খুব ঝুঁকিপূর্ণ হতে পারে।
ঝুঁকি -১) লগিংয়ের সমস্যা: যদি বা ইলসে কোনও লিখিত বিবৃতি থাকে তবে এই ক্ষেত্রে, আপনি প্রতিবার এটি লগইন করবেন।
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
ঝুঁকি -২) পারফরম্যান্স ইস্যু: orElse এর ভিতরে থাকা সামগ্রী যদি সময়-নিবিড় থাকে: সময় নিবিড় বিষয়বস্তু যে কোনও আই / ও ক্রিয়াকলাপ ডিবি কল, এপিআই কল, ফাইল রিডিং হতে পারে। যদি আমরা এই জাতীয় সামগ্রীটি ওরেস () এ রাখি, সিস্টেমটি কোনও ব্যবহারের কোড কার্যকর করে না।
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
ঝুঁকি -3) অবৈধ অবস্থা বা বাগ ইস্যু: যদি orElse এর ভিতরে থাকা সামগ্রীগুলি কোনও অবজেক্টের স্থিতিটি পরিবর্তন করে চলেছে: আমরা একই জায়গায় অন্য কোনও স্থানে অপশনাল.ম্যাপ ফাংশনটির ভিতরে বলতে পারি এবং এটি আমাদের একটি জটিল ত্রুটিতে ফেলতে পারে।
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
তারপরে, আমরা কখন orElse () এর সাথে যেতে পারি?
ডিফল্ট মানটি যখন কিছু ধ্রুবক বস্তু হয় তবে orElse ব্যবহার করতে পছন্দ করুন। উপরের সমস্ত ক্ষেত্রে আমরা Optional.orElseGet () দিয়ে যেতে পারি (যা কেবল তখনই কার্যকর করা হয় যখন অপশনালটি খালি মূল্য না রাখে) Optional.orElse () এর পরিবর্তে। কেন ?? অরলেসে, আমরা ডিফল্ট ফলাফলের মানটি পাস করি, তবে orElseGet এ আমরা সরবরাহকারী এবং সরবরাহকারীটির পদ্ধতিটি কেবল তখনই কার্যকর করি যদি ptionচ্ছিক মানটি শূন্য হয়।
এটি থেকে কী গ্রহণযোগ্যতা:
- যদি এতে কোনও লগ স্টেটমেন্ট থাকে তবে "Optional.orElse" ব্যবহার করবেন না।
- যদি এতে সময়-নিবিড় যুক্তি থাকে তবে "Optional.orElse" ব্যবহার করবেন না।
- যদি এটি কোনও অবজেক্টের স্থিতি পরিবর্তন করে তবে "Oচ্ছিক.অরএলসি" ব্যবহার করবেন না।
- যদি আমাদের একটি ধ্রুবক, এনাম ফিরে আসতে হয় তবে "Oচ্ছিক.অরএলসি" ব্যবহার করুন।
- 1,2 এবং 3 য় পয়েন্টে উল্লিখিত পরিস্থিতিতে "ptionচ্ছিক.অরএলসগেট" পছন্দ করুন।
আমি এটি আমার মাঝারি ব্লগটি পয়েন্ট -2 ( "ptionচ্ছিক.ম্যাপ / অপশনাল.অরএলস"! = "যদি / অন্যথায়" ) ব্যাখ্যা করেছি। কোডার হিসাবে নয় প্রোগ্রামার হিসাবে জাভা 8 ব্যবহার করুন
orElseGet
এটি ব্যবহার করেন কেবল তখনই সরবরাহকারীকে কল করে যখন মানটি অনুপস্থিত।