কেবল সম্পূর্ণতার জন্য, "বেশ কয়েকটি ভেরিয়েবল" কেসটি সত্যই সম্ভব, যদিও এটি মার্জিত নয়। উদাহরণস্বরূপ, ভেরিয়েবলের জন্য o
, p
এবং q
:
Optional.ofNullable( o ).orElseGet(()-> Optional.ofNullable( p ).orElseGet(()-> q ) )
দয়া করে ব্যবহার করে নোট orElseGet()
ক্ষেত্রে যে দোসর o
, p
এবং q
ভেরিয়েবল কিন্তু এক্সপ্রেশন পারেন দামী বা অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া সঙ্গে নয়।
সর্বাধিক সাধারণ ক্ষেত্রে coalesce(e[1],e[2],e[3],...,e[N])
coalesce-expression(i) == e[i] when i = N
coalesce-expression(i) == Optional.ofNullable( e[i] ).orElseGet(()-> coalesce-expression(i+1) ) when i < N
এটি অত্যধিক দীর্ঘ এক্সপ্রেশন তৈরি করতে পারে। যাইহোক, যদি আমরা ছাড়া একটি বিশ্বের কাছে সরানোর চেষ্টা করছেন null
, তাহলে v[i]
হয় সম্ভবত ইতিমধ্যে ধরনের Optional<String>
, যেমন কেবল বিরোধিতা String
। এক্ষেত্রে,
result= o.orElse(p.orElse(q.get())) ;
বা মত প্রকাশের ক্ষেত্রে:
result= o.orElseGet(()-> p.orElseGet(()-> q.get() ) ) ;
তদ্ব্যতীত, যদি আপনি একটি কার্মিক-ঘোষণামূলক শৈলী থেকে সরানোর হয়, o
, p
, এবং q
ধরনের হওয়া উচিত Supplier<String>
মত:
Supplier<String> q= ()-> q-expr ;
Supplier<String> p= ()-> Optional.ofNullable(p-expr).orElseGet( q ) ;
Supplier<String> o= ()-> Optional.ofNullable(o-expr).orElseGet( p ) ;
এবং তারপরে সম্পূর্ণ coalesce
কমে যায় o.get()
।
আরও দৃ concrete় উদাহরণের জন্য:
Supplier<Integer> hardcodedDefaultAge= ()-> 99 ;
Supplier<Integer> defaultAge= ()-> defaultAgeFromDatabase().orElseGet( hardcodedDefaultAge ) ;
Supplier<Integer> ageInStore= ()-> ageFromDatabase(memberId).orElseGet( defaultAge ) ;
Supplier<Integer> effectiveAge= ()-> ageFromInput().orElseGet( ageInStore ) ;
defaultAgeFromDatabase()
, ageFromDatabase()
এবং ageFromInput()
ইতিমধ্যে Optional<Integer>
স্বাভাবিকভাবে ফিরে আসবে ।
এবং তারপর coalesce
হয়ে effectiveAge.get()
বা শুধু effectiveAge
আমরা সন্তুষ্ট যদি Supplier<Integer>
।
আইএমএইচও, জাভা 8 এর সাথে আমরা আরও বেশি সংখ্যক কোড এর মতো কাঠামোগত দেখতে পাব, কারণ এটি একই সাথে অত্যন্ত স্ব-বর্ণনামূলক এবং দক্ষ, বিশেষত আরও জটিল ক্ষেত্রে।
আমি এমন একটি ক্লাস মিস করি Lazy<T>
যা Supplier<T>
কেবলমাত্র একবারে আহ্বান জানায় তবে অলসতা, পাশাপাশি সংজ্ঞা Optional<T>
(যেমন Optional<T>
- Optional<T>
অপারেটর, বা এমনকি Supplier<Optional<T>>
)।