ফেরত ঐচ্ছিক মান হিসাবে ফেরত ঐচ্ছিক আছে, অন্যথায় অন্য ফাংশন কল

আমি দুটি পদ্ধতি func1 এবং func2 আছে যা ঐচ্ছিক ফেরত। ফ্যান্টিক 1 থেকে বিকল্পটি ফেরত থাকলে বিকল্পটি ফেরত করুন, অন্যথায় func2 কল করুন এবং তার বিকল্পটি ফেরত দিন। এক উপায় if-else ব্যবহার করা হয়।

Optional opt1 = func1();
if (opt1.isPresent()) {
    return opt1;
}
return func2();

যাইহোক, আমি জাভা 8 ঐচ্ছিক ব্যবহার করে এটি অর্জন করতে চাই এবং if-else এড়াতে চাই।

কিছুটা এইরকম:

return Optional.of(obj1) 
        .flatMap_returnOptionalIfvaluePresent(func1)
        .orElseReturnOptionalFromThis(func2)

যে কেউ এটি জন্য একটি ভাল উপায় সুপারিশ করতে পারেন?

7
@ মাইকেল আমি এখানে আপনার সাথে থাকি, যদি ওপি আরো ব্যাখ্যা করতে আসে, তবে এটি একটি মোটামুটি ভালো প্রশ্ন হতে পারে
যোগ লেখক Eugene, উৎস
func1 এবং func2 কী? যদি তারা পদ্ধতি হয়, তাহলে বৈধ হতে আপনার কোডটি পুনঃসূচনা করুন। প্রত্যাশিত ইনপুট এবং পছন্দসই আউটপুট প্রদান করুন। প্রশ্নটি পরিষ্কার করতে if-else সরবরাহ করুন।
যোগ লেখক Nikolas, উৎস
এটি একটি ভাল প্রশ্ন হওয়ার সম্ভাবনা রয়েছে তবে বর্তমানে আপনি যা চান তা স্পষ্ট নয়। if-else ব্যবহার করে এমন কোডটি পোস্ট করুন যাতে আপনি যা অর্জন করতে চান তা স্পষ্ট।
যোগ লেখক Michael, উৎস
হার্ড-টু-পঠিত ভাবে কেন আপনি একটি পরিষ্কার এবং সহজ if-else এড়াতে চান?
যোগ লেখক vincrichaud, উৎস

6 উত্তর

বিবেচনা করে আপনার দুটি পদ্ধতি রয়েছে:

Optional func1(String str){
    return Optional.ofNullable(str);
}

 Optional func2(String str){
    return Optional.ofNullable(str);
}

এবং তুমি যা চাও তা হল বেল্লার মতো

String s = null;
Optional result = Optional.ofNullable(func1(s)
                                  .orElse(func2("Hello")
                                  .orElse("Hi")));

কিন্তু আমি মনে করি if-else সংস্করণটি আরও পাঠযোগ্য!

0
যোগ

মত কিছু সম্পর্কে কি

Object value1 = func1();
return value1.isPresent() ? value1 : func2();

যতক্ষণ না আপনি পরে যা করছেন তা ভুল বুঝে না থাকলে এটি যদি উপস্থিত থাকে তবে প্রথম ফাংশন থেকে মানটি ফেরত দেবে এবং যদি এটি বিদ্যমান না হয় তবে দ্বিতীয় বিকল্পটি ফেরত দিতে func2() কল করুন। আপনি সম্ভবত এটি func1 ()। IsPresent এ আরও সরল করে তুলতে পারেন তবে এটিটি একটু কম স্পষ্ট করে তুলেছে।

0
যোগ

আমি যে জন্য একটি জেনেরিক পদ্ধতি তৈরি করবে:

public static  Optional firstPresent(Optional... optionals) {
    return Arrays.stream(optionals)
                 .filter(Optional::isPresent)
                 .findFirst()
                 .orElseThrow(IllegalArgumentException::new);//or any other exception 
}
0
যোগ

Edit: or

জাভা 9 একটি খুব মার্জিত সমাধান প্রস্তাব করে:

Optional myFunc() {
    return func1().or(this::func2);
}

জাভা 8

বিভিন্ন উপায় আছে। আমি ঐচ্ছিক গুলি থেকে func1 এবং func2 থেকে মানগুলি নিতে পছন্দ করি:

Optional myFunc() {
    String returnValue = func1().orElse(func2().orElse(null));
    return Optional.ofNullable(returnValue);
}

যদি func2 এ কলটি ব্যয়বহুল, তবে এটি যখন প্রয়োজন হয় না তখন আপনি এটিকে এড়াতে চাইতে পারেন (যখন func1 একটি মান সরবরাহ করে):

    String returnValue = func1().orElseGet(() -> func2().orElse(null));

isPresent used in a couple of other answers is so low-level, I seldom use it and only as a last resort.

0
যোগ
না, @ আদিমোহ, তবে আপনি অবশ্যই যদি এটি পছন্দ করেন তবে এটি ইনলাইন করতে পারেন: ঐচ্ছিক.ফোনেবল (func1 ()। অথবা else (func2 ()) অথবা else (null));
যোগ লেখক Ole V.V., উৎস
বাতিল করতে Optional.ofNullable (returnValue) ফিরতে কোনও বিকল্প API আছে;
যোগ লেখক adimoh, উৎস

এখানে n ফাংশনগুলির সাথে কাজ করে আরো জেনেরিক সংস্করণ রয়েছে:

private static  Optional firstPresent(Supplier>... optionals) {
    return Stream.of(optionals)
            .map(Supplier::get)
            .filter(Optional::isPresent)
            .findFirst()
            .orElse(Optional.empty());
}

এটি ব্যবহার করা যেতে পারে:

    Optional result = firstPresent(() -> func1(null),() -> func2("abc"));
0
যোগ

এটা কিছু হবে, যদি আমি সঠিকভাবে সবকিছু tusterstand:

Optional.of(obj1)
        .filter(obj -> func1().isPresent())
        .orElse(func2());
0
যোগ
অথবা ঐচ্ছিক বিকল্প মান ফেরত। আমি ঐচ্ছিক নিজেই ফিরে করতে চান।
যোগ লেখক adimoh, উৎস
অথবা eslse func2() ফাংশন ফলাফল প্রদান করে এবং এটি ঐচ্ছিক প্রদান করে, তাই না?
যোগ লেখক Artur Vakhrameev, উৎস