জাভা 8 এর Funচ্ছিক.আইফপ্রেসেন্ট এবং যদি না-বর্তমানের কার্যকরী শৈলী?


274

জাভা 8-তে, আমি কোনও Optionalঅবজেক্ট উপস্থিত থাকলে কিছু করতে চাই এবং এটি উপস্থিত না থাকলে অন্য কাজ করতে চাই।

if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}

যদিও এটি 'কার্যকরী শৈলী' নয়।

Optionalএকটি ifPresent()পদ্ধতি আছে, কিন্তু আমি একটি orElse()পদ্ধতি শৃঙ্খল করতে অক্ষম ।

সুতরাং, আমি লিখতে পারি না:

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));

@Asslias জবাবে, আমি মনে করি না যে Optional.map()নিম্নলিখিত ক্ষেত্রে কাজ করে:

opt.map( o -> {
  System.out.println("while opt is present...");
  o.setProperty(xxx);
  dao.update(o);
  return null;
}).orElseGet( () -> {
  System.out.println("create new obj");
  dao.save(new obj);
  return null;
});

এই ক্ষেত্রে, যখন optউপস্থিত থাকি, আমি এর সম্পত্তি আপডেট করি এবং ডাটাবেসে সংরক্ষণ করি। এটি উপলভ্য না হলে আমি একটি নতুন তৈরি objকরে ডেটাবেসে সংরক্ষণ করি।

দুটি ল্যাম্বডায় নোট আমাকে ফিরতে হবে null

তবে যখন optউপস্থিত হবে, উভয় ল্যাম্বডাস কার্যকর করা হবে। objআপডেট করা হবে, এবং একটি নতুন বস্তু ডাটাবেসে সংরক্ষণ করা হবে। এটি কারণ return nullপ্রথম ল্যাম্বডায়। এবং orElseGet()কার্যকর করা চালিয়ে যাবে।


53
আপনার প্রথম নমুনা ব্যবহার করুন। এটা সুন্দর
সোটিরিওস ডেলিমনোলিস

3
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এমন কোনও এপিআই ব্যবহার করবেন যখন সেই আচরণের জন্য ডিজাইন করা হয়নি using কিছু ছোট স্টাইলের মন্তব্য বাদে আপনি প্রথম উদাহরণটি আমার কাছে ভাল দেখায় তবে সেগুলি তাত্পর্যপূর্ণ।
স্কিভি

4
@ স্মলুফো: (উভয়) return null;দিয়ে প্রতিস্থাপন করুন return o;। যাইহোক, আমার দৃ .় অনুভূতি আছে যে আপনি ভুল জায়গায় কাজ করছেন। আপনার যে সাইটটি তৈরি হয়েছিল সেখানে কাজ করা উচিত Optional। সেই জায়গায় মধ্যবর্তী ছাড়াই পছন্দসই অপারেশন করার একটি উপায় থাকা উচিত Optional
হলগার

10
জাভা 9 আপনার সমস্যার সমাধান কার্যকর করে: পুনরার্নিং.জাজা 9/06/07/57
পিসারুক

2
আমি মনে করি যে এটি সহজে করা যায় না তার কারণটি উদ্দেশ্য। Ptionচ্ছিককে প্রবাহ নিয়ন্ত্রণ করা উচিত নয়, বরং মান রূপান্তর করা উচিত। আমি এর ifPresentবিরোধিতা জানি । অন্যান্য সমস্ত পদ্ধতি ক্রিয়াকে না করে মানকে বোঝায়।
অ্যালিক্লিজিন-কিলাকা

উত্তর:


109

আমার জন্য @ ডেন হোয়াইটের উত্তর ঠিক আছে, প্রথমে আমি রান্নেবল ব্যবহার পছন্দ করি না তবে আমি কোনও বিকল্প খুঁজে পাই না, এখানে অন্য একটি বাস্তবায়ন আমি বেশি পছন্দ করেছি

public class OptionalConsumer<T> {
    private Optional<T> optional;

    private OptionalConsumer(Optional<T> optional) {
        this.optional = optional;
    }

    public static <T> OptionalConsumer<T> of(Optional<T> optional) {
        return new OptionalConsumer<>(optional);
    }

    public OptionalConsumer<T> ifPresent(Consumer<T> c) {
        optional.ifPresent(c);
        return this;
    }

    public OptionalConsumer<T> ifNotPresent(Runnable r) {
        if (!optional.isPresent()) {
            r.run();
        }
        return this;
    }
}

তারপরে:

Optional<Any> o = Optional.of(...);
OptionalConsumer.of(o).ifPresent(s ->System.out.println("isPresent "+s))
            .ifNotPresent(() -> System.out.println("! isPresent"));

আপডেট 1:

traditionalতিহ্যগতভাবে উন্নয়নের পদ্ধতির জন্য উপরের সমাধানটি যখন আপনার মান রয়েছে এবং এটি প্রক্রিয়া করতে চান তবে আমি যদি কার্যকারিতাটি সংজ্ঞায়িত করতে চাই এবং কার্যকর করা হবে তবে নীচে বর্ধন পরীক্ষা করুন;

public class OptionalConsumer<T> implements Consumer<Optional<T>> {
private final Consumer<T> c;
private final Runnable r;

public OptionalConsumer(Consumer<T> c, Runnable r) {
    super();
    this.c = c;
    this.r = r;
}

public static <T> OptionalConsumer<T> of(Consumer<T> c, Runnable r) {
    return new OptionalConsumer(c, r);
}

@Override
public void accept(Optional<T> t) {
    if (t.isPresent()) {
        c.accept(t.get());
    }
    else {
        r.run();
    }
}

তারপরে ব্যবহার করা যেতে পারে:

    Consumer<Optional<Integer>> c=OptionalConsumer.of(System.out::println, ()->{System.out.println("Not fit");});
    IntStream.range(0, 100).boxed().map(i->Optional.of(i).filter(j->j%2==0)).forEach(c);

এই নতুন কোডে আপনার কাছে 3 টি জিনিস রয়েছে:

  1. সহজ অবজেক্ট বিদ্যমান বিদ্যমান কার্যকারিতা সংজ্ঞায়িত করতে পারেন।
  2. প্রতিটি ptionচ্ছিকের জন্য অবজেক্ট রেফারেন্স তৈরি না করা, কেবল একটির, আপনার কম স্মৃতিশক্তি কম জিসি থাকে।
  3. এটি অন্যান্য উপাদানগুলির সাথে আরও ভাল ব্যবহারের জন্য ভোক্তা বাস্তবায়ন করছে।

উপায় দ্বারা এখন এর নামটি আরও বর্ণনামূলক এটি আসলে গ্রাহক>



2
আপনি নুলাবল ব্যবহার করতে হবে আপনি যদি নিশ্চিত হন না যে আপনি যে মানটি ব্যবহার করতে যাচ্ছেন তার নালাগুলি রয়েছে বা না এবং এনপিইর মুখোমুখি হওয়ার দরকার নেই, এবং আপনি যদি নিশ্চিত যে এটি নাল নয় বা আপনি যদি যত্ন পান না তবে NPE।
বাসেম রেদা জোহডি

1
আমি মনে করি classচ্ছিক কনসুমার ক্লাসটি / অন্য কোডের চেয়ে আরও ভাল দেখাচ্ছে। ধন্যবাদ! :)
witek1902

207

আপনি যদি জাভা 9+ ব্যবহার করেন তবে আপনি ifPresentOrElse()পদ্ধতিটি ব্যবহার করতে পারেন :

opt.ifPresentOrElse(
   value -> System.out.println("Found: " + value),
   () -> System.out.println("Not found")
);

3
নিস কারণ এটি Scala মধ্যে প্যাটার্ন ম্যাচিং হিসাবে প্রায় পরিষ্কার হিসাবে
sscarduzio

দুটি ল্যাম্বদা এর মতো দেখতে বেশ কুৎসিত। আমি মনে করি / যদি এই ক্ষেত্রেগুলির জন্য আরও পরিষ্কার হয়।
16384

1
@ জন 16384 ঠিক আছে, আপনি যদি এটি কুৎসিত দেখতে পান তবে আমি আমার উত্তরটি মুছে ফেলব (না)।
ZhekaKozlov

এটি খুব সুন্দর তবে প্রশ্নটি বিশেষত জেডিকে 8-এর জন্য বোঝানো হয়েছে কারণ যদি প্রিপ্রেসনঅরলিজ উপলভ্য নয়।
hreinn

81

জাভা 9 পরিচয় করিয়ে দেয়

ifPLiveOrElse যদি একটি মান উপস্থিত থাকে তবে মান সহ প্রদত্ত ক্রিয়া সম্পাদন করে, অন্যথায় প্রদত্ত খালি ভিত্তিক ক্রিয়া সম্পাদন করে।

চমৎকার দেখুন জাভা 8 ঠকাই শীট ঐচ্ছিক

এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে সমস্ত উত্তর সরবরাহ করে।

নীচে সংক্ষিপ্তসার

ifPstream () - alচ্ছিক সেট হয়ে গেলে কিছু করুন

opt.ifPresent(x -> print(x)); 
opt.ifPresent(this::print);

ফিল্টার () - প্রত্যাখ্যান (ফিল্টার আউট) নির্দিষ্ট ptionচ্ছিক মান।

opt.filter(x -> x.contains("ab")).ifPresent(this::print);

মানচিত্র () - উপস্থিত থাকলে রূপান্তর মান

opt.map(String::trim).filter(t -> t.length() > 1).ifPresent(this::print);

orElse () / orElseGet () - খালি ptionচ্ছিক ডিফল্ট টি তে রূপান্তর করা

int len = opt.map(String::length).orElse(-1);
int len = opt.
    map(String::length).
    orElseGet(() -> slowDefault());     //orElseGet(this::slowDefault)

orElseThrow () - অলসভাবে খালি ptionচ্ছিক উপর ব্যতিক্রম নিক্ষেপ করুন

opt.
filter(s -> !s.isEmpty()).
map(s -> s.charAt(0)).
orElseThrow(IllegalArgumentException::new);

66
এটি আসলে ওপির প্রশ্নের উত্তর দেয় না। এটি প্রচুর সাধারণ ব্যবহারের উত্তর দেয় তবে ওপি যা বলেছিল তা নয়।
ক্যাপ্টেন ম্যান

1
@ ক্যাপ্টেনম্যান আসলে এটি করে; opt.map ("পাওয়া")। বা এলেস ("পাওয়া যায়নি") এক্সপ্রেশনটি বিলটি পূরণ করে।
ম্যাট

4
@ ম্যাট না, ওপি বিশেষত performedচ্ছিক উপস্থিত / উপস্থিত না থাকাকালীন তার সম্পাদনের জন্য পদক্ষেপের জন্য জিজ্ঞাসা করছে, যখন আছে বা নেই তখন কোনও মান ফিরিয়ে দেয় না। এমনকি ওপিতে প্রশ্নটিতে অনুরূপ কিছু উল্লেখ করেছে বা এলেক্স গেট ব্যবহার করে কেন এটি কাজ করবে না তা ব্যাখ্যা করে।
ক্যাপ্টেন ম্যান

2
@ ক্যাপিটেনম্যান আমি আপনার বক্তব্যটি দেখতে পাচ্ছি। আমি মনে করি যে তিনি যদি এটি থেকে শূন্য না ফেরেন তবে তিনি এটি কাজ করতে পারেন mapতবে কার্যকরী সমাধান জিজ্ঞাসা করা কিছুটা আশ্চর্যজনক যাতে আপনি ডিএও-কে কল করতে পারেন। আমার কাছে মনে হয় এই map.orElseব্লকটি থেকে আপডেট হওয়া / নতুন অবজেক্টটি ফিরিয়ে দেওয়া এবং তারপরে ফিরে আসা অবজেক্টের সাথে আপনার যা করা দরকার তা আরও বোধগম্য হবে ।
ম্যাট

1
আমি মনে করি mapস্ট্রিমটিতে নিজেই মনোনিবেশ করব এবং "স্ট্রিমের এই উপাদানটির স্থিতির উপর নির্ভর করে অন্য কোনও জিনিসে জিনিস করা" এর উদ্দেশ্য নয়। ifPresentOrElseজাভা 9 এ যুক্ত হয়েছে তা জেনে রাখা ভাল
ওয়েস্টার্নগান

53

একটি বিকল্প হ'ল:

System.out.println(opt.map(o -> "Found")
                      .orElse("Not found"));

আমি মনে করি না যদিও এটি পঠনযোগ্যতার উন্নতি করে।

অথবা মার্কো যেমন পরামর্শ দিয়েছেন, ত্রিনিরি অপারেটর ব্যবহার করুন:

System.out.println(opt.isPresent() ? "Found" : "Not found");

2
ধন্যবাদ @ এ্যাসিয়ালিয়াস, তবে আমি মনে করি না যে ptionচ্ছিক.ম্যাপ () মামলার পক্ষে কাজ করে (আমার প্রসঙ্গের আপডেটটি দেখুন)।
স্মার্টুফো

2
@smallufo new Object();আপনার প্রথম ল্যাম্বডায় ফিরে আসতে হবে তবে সত্যি বলতে খুব কুৎসিত হয়। আপনার আপডেট হওয়া উদাহরণের জন্য আমি যদি / অন্যথায় লেগে থাকি।
অ্যাসিলিয়াস

সম্মত হন, mapকেবল Optionalশৃঙ্খলার জন্য ফিরতে ব্যবহার করা কোডটিকে বোঝা আরও শক্ত করে তোলে যখন mapআক্ষরিকভাবে কোনও কিছুর মানচিত্র করা হয়।
টাইনা

40

আরও একটি সমাধান হ'ল নিম্ন-অর্ডার ফাংশনগুলি নিম্নরূপে ব্যবহার করা হবে

opt.<Runnable>map(value -> () -> System.out.println("Found " + value))
   .orElse(() -> System.out.println("Not Found"))
   .run();

8
আমার চোখে এখন পর্যন্ত জেডিকে 9. ছাড়াই সেরা সমাধান
Semaphor

5
একটি ব্যাখ্যা দুর্দান্ত হবে। আমি নিজেকে জিজ্ঞাসা করছি, কেন আপনাকে চলমান মানচিত্র (?) ব্যবহার করতে হবে এবং value -> () -> sysoঅংশটির অর্থ কী?
froehli

এই সমাধানের জন্য ধন্যবাদ! আমি মনে করি রান্নেবল ব্যবহারের কারণটি হ'ল আউট ম্যাপটি কোনও মান দেয় না এবং রাননেবলের সাহায্যে এটি ল্যাম্বদা ফেরত দেয় এবং যেমন মানচিত্রের ফলস্বরূপ লাম্বদা হয় আমরা এটির পরে চালাই। সুতরাং যদি আপনার কাছে ফেরতের মান থাকে তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:String result = opt.map(value -> "withOptional").orElse("without optional");
ন্যানোটেক্সনিমিক

21

বাক্স থেকে বাইরে বেরোনোর ​​দুর্দান্ত উপায় নেই। আপনি যদি নিয়মিতভাবে আপনার ক্লিনার সিনট্যাক্সটি ব্যবহার করতে চান তবে আপনি সাহায্যের জন্য একটি ইউটিলিটি ক্লাস তৈরি করতে পারেন:

public class OptionalEx {
    private boolean isPresent;

    private OptionalEx(boolean isPresent) {
        this.isPresent = isPresent;
    }

    public void orElse(Runnable runner) {
        if (!isPresent) {
            runner.run();
        }
    }

    public static <T> OptionalEx ifPresent(Optional<T> opt, Consumer<? super T> consumer) {
        if (opt.isPresent()) {
            consumer.accept(opt.get());
            return new OptionalEx(true);
        }
        return new OptionalEx(false);
    }
}

তারপরে আপনি সিনট্যাক্স পেতে অন্যত্র স্থিতিশীল আমদানি ব্যবহার করতে পারেন যা আপনার পরে যা রয়েছে তার কাছাকাছি:

import static com.example.OptionalEx.ifPresent;

ifPresent(opt, x -> System.out.println("found " + x))
    .orElse(() -> System.out.println("NOT FOUND"));

ধন্যবাদ। এই সমাধানটি সুন্দর। আমি জানি সেখানে সম্ভবত কোনও অন্তর্নিহিত সমাধান নেই (যদি না জেডিকে এ জাতীয় পদ্ধতি অন্তর্ভুক্ত করে)। আপনি ptionচ্ছিকএক্স খুব সহায়ক। যাই হোক ধন্যবাদ.
স্মার্টুফো

হ্যাঁ, আমি ফলাফলটি পছন্দ করি এবং স্টাইল এটি সমর্থন করে। সুতরাং, স্ট্যান্ডার্ড এপিআইতে নেই কেন?
গুথ্রি

ভাল উত্তর. আমরাও তাই করি। আমি সম্মত হলাম এটি API এ হওয়া উচিত (বা ভাষা!) তবে এটি অস্বীকার করা হয়েছে: bugs.openjdk.java.net/browse/JDK-8057557
গ্যারেট স্মিথ

খুশী হলাম। বিবেচনার জন্য এটি জেডিকে 8.1 এর অংশ হওয়া উচিত।
পিটার_পিলগ্রিম

35
Optional.ifPresentOrElse()জেডিকে ৯-এ যুক্ত করা হয়েছে
স্টুয়ার্ট

9

আপনি যদি কেবল জাভা 8 বা নিম্ন ব্যবহার করতে পারেন:

1) যদি আপনার spring-dataএখনও অবধি সবচেয়ে ভাল উপায় না থাকে:

opt.<Runnable>map(param -> () -> System.out.println(param))
      .orElse(() -> System.out.println("no-param-specified"))
      .run();

এখন আমি জানি এটি এতটা পঠনযোগ্য নয় এবং কারও পক্ষে বোঝা এমনকি শক্ত নয়, তবে ব্যক্তিগতভাবে আমার পক্ষে এটি বেশ ভাল দেখাচ্ছে এবং আমি এই মামলার আর একটি দুর্দান্ত সাবলীল উপায় দেখতে পাচ্ছি না।

2) যদি আপনি যথেষ্ট ভাগ্যবান হন এবং আপনি spring-dataসর্বোত্তম উপায়টি ব্যবহার করতে পারেন হ'ল বিকল্পগুলি # ifPLiveOrElse :

Optionals.ifPresentOrElse(opt, System.out::println,
      () -> System.out.println("no-param-specified"));

আপনি যদি জাভা 9 ব্যবহার করতে পারেন তবে অবশ্যই আপনার সাথে এটি করা উচিত:

opt.ifPresentOrElse(System.out::println,
      () -> System.out.println("no-param-specified"));

2

বর্ণিত আচরণটি জাভা 8+ এর অবজেক্ট-ফাংশনাল লাইব্রেরি ভ্যাভার (পূর্বে জাভাসলং নামে পরিচিত) ব্যবহার করে অর্জন করা যেতে পারে , যা বেশিরভাগ স্কালার কনস্ট্রাক্টসকে কার্যকর করে ( স্কেওয়াকে আরও ভালভাবে জেভিএম-তে নির্মিত ধরণের ধরণের সিস্টেমের সাথে আরও স্পষ্ট ভাষায় ভাষা বলে) ব্যবহার করে। খাঁটি ফাংশনাল কোড লিখতে আপনার জাভা প্রকল্পগুলিতে যুক্ত করা এটি খুব ভাল গ্রন্থাগার।

Vavr Optionmonad সরবরাহ করে যা অপশন টাইপের সাথে কাজ করার জন্য ফাংশন সরবরাহ করে যেমন:

  • fold: উভয় ক্ষেত্রে বিকল্পের মানচিত্র তৈরি করতে (সংজ্ঞায়িত / খালি)
  • onEmpty: Runnableযখন বিকল্পটি খালি থাকে তখন একটি কার্যকর করতে দেয়
  • peek: অপশনটির মান গ্রাহ্য করতে দেয় (যখন সংজ্ঞায়িত হয়)।
  • এবং এটি Serializableএর বিপরীতে রয়েছে Optionalযার অর্থ আপনি এটি নিরাপদে পদ্ধতিতে যুক্তি এবং উদাহরণ সদস্য হিসাবে ব্যবহার করতে পারবেন।

অপশনটি জাভার ptionচ্ছিক "সিউডো-মোনাড" এর সাথে পার্থক্যযুক্ত মোনাড আইন অনুসরণ করে এবং আরও সমৃদ্ধ এপিআই সরবরাহ করে। এবং অবশ্যই আপনি এটি একটি জাভার Option.ofOptional(javaOptional)ptionচ্ছিক (এবং অন্যান্য উপায়ে) থেকে তৈরি করতে পারেন: avভ্যাওয়ার আন্তঃব্যবযোগিতার উপর দৃষ্টি নিবদ্ধ করে।

উদাহরণে যাচ্ছি:

// AWESOME Vavr functional collections (immutable for the gread good :)
// fully convertible to Java's counterparts.
final Map<String, String> map = Map("key1", "value1", "key2", "value2");

final Option<String> opt = map.get("nonExistentKey"); // you're safe of null refs!

final String result = opt.fold(
        () -> "Not found!!!",                // Option is None
        val -> "Found the value: " + val     // Option is Some(val)
);

আরও পড়া

নাল রেফারেন্স, বিলিয়ন ডলার ভুল

এনবি এটি ভিভর কী অফার করে তার খুব সামান্য উদাহরণ (প্যাটার্ন ম্যাচিং, স্ট্রিমস ওরফে অলস মূল্যায়ন তালিকা, মনাদিক প্রকার, অপরিবর্তনীয় সংগ্রহ, ...)।


1

আর একটি সমাধান নিম্নলিখিত হতে পারে:

আপনি এটি এভাবে ব্যবহার করেন:

    final Opt<String> opt = Opt.of("I'm a cool text");
    opt.ifPresent()
        .apply(s -> System.out.printf("Text is: %s\n", s))
        .elseApply(() -> System.out.println("no text available"));

অথবা আপনি যদি বিপরীত ব্যবহারের ক্ষেত্রে সত্য হন তবে:

    final Opt<String> opt = Opt.of("This is the text");
    opt.ifNotPresent()
        .apply(() -> System.out.println("Not present"))
        .elseApply(t -> /*do something here*/);

এই উপাদানগুলি:

  1. সামান্য পরিবর্তিত ফাংশন ইন্টারফেস, কেবলমাত্র "অন্য অ্যাপ্লিকেশন" পদ্ধতির জন্য
  2. .চ্ছিক বর্ধন
  3. কিছুটা কার্নিং :-)

"কসমেটিকালি" বর্ধিত ফাংশন ইন্টারফেস।

@FunctionalInterface
public interface Fkt<T, R> extends Function<T, R> {

    default R elseApply(final T t) {
        return this.apply(t);
    }

}

এবং বর্ধনের জন্য ptionচ্ছিক র্যাপার ক্লাস:

public class Opt<T> {

    private final Optional<T> optional;

    private Opt(final Optional<T> theOptional) {
        this.optional = theOptional;
    }

    public static <T> Opt<T> of(final T value) {
        return new Opt<>(Optional.of(value));
    }

    public static <T> Opt<T> of(final Optional<T> optional) {
        return new Opt<>(optional);
    }

    public static <T> Opt<T> ofNullable(final T value) {
        return new Opt<>(Optional.ofNullable(value));
    }

    public static <T> Opt<T> empty() {
        return new Opt<>(Optional.empty());
    }

    private final BiFunction<Consumer<T>, Runnable, Void> ifPresent = (present, notPresent) -> {
        if (this.optional.isPresent()) {
            present.accept(this.optional.get());
        } else {
            notPresent.run();
        }
        return null;
    };

   private final BiFunction<Runnable, Consumer<T>, Void> ifNotPresent = (notPresent, present) -> {
        if (!this.optional.isPresent()) {
            notPresent.run();
        } else {
            present.accept(this.optional.get());
        }
        return null;
    };

    public Fkt<Consumer<T>, Fkt<Runnable, Void>> ifPresent() {
        return Opt.curry(this.ifPresent);
    }

    public Fkt<Runnable, Fkt<Consumer<T>, Void>> ifNotPresent() {
        return Opt.curry(this.ifNotPresent);
    }

    private static <X, Y, Z> Fkt<X, Fkt<Y, Z>> curry(final BiFunction<X, Y, Z> function) {
        return (final X x) -> (final Y y) -> function.apply(x, y);
    }
}

এটি কৌশলটি করা উচিত এবং কীভাবে এই জাতীয় প্রয়োজনীয়তাগুলি মোকাবেলা করতে হবে এটি একটি প্রাথমিক টেম্পলেট হিসাবে পরিবেশন করতে পারে।

এখানে মূল ধারণা অনুসরণ করা হয়। একটি অ কার্যক্ষম স্টাইল প্রোগ্রামিং জগতে আপনি সম্ভবত দুটি পরামিতি গ্রহণের একটি পদ্ধতি প্রয়োগ করবেন যেখানে প্রথমটি এক ধরণের রান্নেবল কোড যা মান উপলব্ধ হলে কার্যকর করা উচিত এবং অন্য পরামিতিটি রান্নেবল কোড যা ক্ষেত্রে চালানো উচিত মান পাওয়া যায় না। আরও ভাল পঠনযোগ্যতার জন্য, আপনি প্রতিটি প্যারামিটারের দুটি ফাংশনে দুটি পরামিতির ফাংশনকে বিভক্ত করতে কার্নিং ব্যবহার করতে পারেন। আমি এখানে মূলত এটি করেছি।

ইঙ্গিত: অপ্ট এছাড়াও অন্যান্য ব্যবহারের ক্ষেত্রে প্রদান করে যেখানে আপনি মানটি উপলব্ধ না হলে কেবল কোনও কোডের টুকরাক কার্যকর করতে চান। এটি Optional.filter.stuff এর মাধ্যমেও করা যেতে পারে তবে আমি এটি আরও বেশি পাঠযোগ্য।

আশা করি এইটি কাজ করবে!

ভাল প্রোগ্রামিং :-)


আপনি কি বলতে পারেন কি কাজ করছে না? আমি আবার এটি পরীক্ষা করেছি এবং আমার জন্য এটি কাজ করছে?
আলেসান্দ্রো গিয়াস

মাফ করবেন, তবে সাইকাস এফকেটি কোথায় সংজ্ঞায়িত হয়েছে? সর্বশেষে তবে কমপক্ষে আমার একটি সংকলন সমস্যা রয়েছে: ত্রুটি: (35, 17) জাভা: পরিবর্তনশীল
alচ্ছিকটি

Fkt ইন্টারফেস হিসাবে উপরে সংজ্ঞায়িত করা হয়। কেবল পুরো নিবন্ধটি পড়ুন :-)
আলেসান্দ্রো গিয়াস

হ্যাঁ. আমি EFunction ইন্টারফেসটি নাম হিসাবে Fkt এ পরিবর্তন করেছি। টাইপো ছিল। পর্যালোচনার জন্য ধন্যবাদ :-) এর জন্য দুঃখিত।
আলেসান্দ্রো গিয়াস

আমি মনে করি না যে এই জাতীয় কোড লেখা ভাল ধারণা ... আপনি যখন পারেন তখন আপনার jdk ইউটিলিটি ব্যবহার করা উচিত।
টিউলপান টিউলপান

0

আপনি যদি মানটি সঞ্চয় করতে চান তবে:

Pair.of<List<>, List<>> output = opt.map(details -> Pair.of(details.a, details.b))).orElseGet(() -> Pair.of(Collections.emptyList(), Collections.emptyList()));

0

মনে করুন যে আপনার একটি তালিকা রয়েছে এবং isPresent()সমস্যাটি এড়ানো ( বিকল্পগুলির সাথে সম্পর্কিত) আপনি .iterator().hasNext()উপস্থিত না থাকলে যাচাই করতে ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.