অন্তর্নির্মিত জাভা 8 হ'ল প্রিপিকেট কি সবসময় সত্য হয়?


129

গুগল পেয়ারা একটি শিকারী যা সর্বদা ফিরে আসেtrue । জাভা 8 এর কি এর সাথে কিছু মিল রয়েছে Predicate? আমি জানি যে আমি ব্যবহার করতে পারি (foo)->{return true;}, তবে আমি প্রাক-তৈরির মতো কিছু চাই, যার সাথে সদৃশ Collections.emptySet()

উত্তর:


162

জাভা ৮-এ কোনও অন্তর্নির্মিত সদা-সত্য এবং সর্বদা-মিথ্যা পূর্বাভাস নেই these এগুলি লেখার সর্বাধিক সংক্ষিপ্ত উপায়

x -> true

এবং

x -> false

এগুলির সাথে তুলনা করুন

Predicates.alwaysTrue() // Guava

এবং শেষ পর্যন্ত একটি বেনামে অভ্যন্তর শ্রেণীর কাছে:

new Predicate<Object>() {
    public boolean test(Object x) {
        return true;
    }
}

সম্ভবত পেয়ারার এই অন্তর্নির্মিত পূর্বাভাসগুলি রাখার কারণটি হ'ল অজ্ঞাতনামা অভ্যন্তর শ্রেণীর উপর স্থির পদ্ধতি কল করার একটি বিশাল সিনট্যাকটিক সুবিধা রয়েছে। জাভা 8-এ, ল্যাম্বদা সিনট্যাক্সটি এত সংক্ষিপ্ত যে স্থির পদ্ধতি কলটি লেখার ক্ষেত্রে সিনট্যাকটিক অসুবিধা রয়েছে

যদিও এটি কেবল একটি সিনট্যাকটিক তুলনা। x -> trueএকাধিক ক্লাস জুড়ে ছড়িয়ে পড়া ঘটনার তুলনায় যদি একক বিশ্বব্যাপী সর্বদা-সত্য ভবিষ্যদ্বাণী থাকত তবে সম্ভবত একটি ছোট স্থানের সুবিধা রয়েছে যার মধ্যে প্রতিটি তার নিজস্ব প্রাকটিক উদাহরণ তৈরি করবে। আপনি কি এই সম্পর্কে উদ্বিগ্ন? সঞ্চয়গুলি বাধ্যতামূলক বলে মনে হয় নি, সম্ভবত এই কারণেই তারা প্রথম স্থানে যুক্ত হয়নি। তবে এটি ভবিষ্যতের মুক্তির জন্য পুনর্বিবেচনা করা যেতে পারে।

আপডেট 2015-04-24

আমরা স্ট্যাটিক বিভিন্ন যোগে বিবেচিত করেছি, যেমন নামে ফাংশন Predicate.alwaysTrue, Runnable.noopইত্যাদি, এবং আমরা জাভা SE ভবিষ্যত যে কোন আরো যোগ না করার সিদ্ধান্ত নিয়েছি।

অবশ্যই কোনও কিছুর কিছু মান আছে যার একটি নাম বনাম একটি লিখিত আউট লাম্বদা রয়েছে, তবে এই মানটি খুব কম। আমরা আশা করি মানুষ শিখতে হবে পড়া কিভাবে এবং লেখার x -> trueএবং () -> { }এবং তাদের ব্যবহার কথ্য পরিণত করবে। এমনকি মানFunction.identity() ওভারেরx -> x প্রশ্নবিদ্ধ।

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

হোলার যেমন Predicate.orএবং যেমন রচিত ফাংশনগুলি অনুকূল করে তোলার সম্ভাবনা সম্পর্কেও মন্তব্য করেছিলেন । এটিও বিবেচিত হয়েছিল ( জেডিকে -8067971) ) তবে এটি কিছুটা ভঙ্গুর এবং ত্রুটি-প্রবণ ঘটেছিল যে এটি বাস্তবায়নের প্রচেষ্টাটির পক্ষে কার্যকর ছিল না।

এই ল্যাম্বদা FAQ এন্ট্রিটিও দেখুন See


14
দুটি উদ্বেগ: প্রথমটি ব্রোভিটি। যদি (foo)->{return true;}আমি সবচেয়ে ভাল করতে পারি তবে আমি আরও ভাল চাই। তবে আপনি আনেন x->true, যা অনেক ভাল এবং প্রথম সংখ্যাটি প্রশমিত করে। দ্বিতীয় ইস্যুটি যুক্তি বনাম স্থির ঘোষণার। যদি আমি ব্যবহার x->trueকরি তবে এখনও যুক্তি জড়িত রয়েছে, যা আমি অজান্তেই স্ক্রু আপ করতে পারি (উদাঃ x->!true)। তবে এর সাথে Predicate.alwaysTrue()যুক্তি ত্রুটির শূন্য স্থান রয়েছে, কারণ এখানে কেবল দুটি বা দুটি একই পদ্ধতি রয়েছে। প্লাস আমি বিনামূল্যে আইডিই কোড সমাপ্তি পেতে। x->trueপ্রায় ঠিক আছে, তবে আমি Predicate.alwaysTrue()উপরের কারণে একটি পদ্ধতি লিখেছি ।
গ্যারেট উইলসন

10
@ গ্যারেট উইলসন তবে আপনার সাথে Predicate.alwaysTrue()দুর্ঘটনাক্রমে লেখার বিষয়টিও ফাঁস হয়ে যেতে পারে Predicate.alwaysFalse()
ডেভিড কনরাড

5
@ ডেভিডকনরড অবশ্যই। আমি সবসময় ভুল করতে পারি এমন উপায় রয়েছে এবং আসলে আমি ক্রমাগত নতুন আবিষ্কার করি। ;) আমি এখানে তুচ্ছ কিছু নিয়ে তর্ক শুরু করতে চাই না, তবে আমি কেবল এটিই বলব যে আমার বক্তব্যটি হ'ল স্থির পদ্ধতির রেফারেন্সের সাথে আমার কেবল দুটি পছন্দ সহ একটি সীমাবদ্ধ শব্দভাণ্ডার রয়েছে: alwaysTrue()এবং alwaysFalse()। আসল ল্যাম্বদা সহ আমার অনেকগুলি প্রকরণ রয়েছে; আমি মূলত প্রতিটি সময় সূত্রটি পুনর্গঠন করছি। সংক্ষেপে, alwaysTrue()আমি যা করতে চাই তার জন্য একটি অর্থপূর্ণ লেবেল; x->trueআসলে প্রতিটি সময় আবার এটি করছেন। বিশাল নয়, তবে একটি বিবেচনা।
গ্যারেট উইলসন

25
ক্যানোনিকাল এক বড় সুবিধা Predicate.alwaysTrue()এবং Predicate.alwaysFalse()দৃষ্টান্ত যে, তারা মত পদ্ধতি মিশ্রন দ্বারা স্বীকৃত হতে পারে, হয় Predicate.or, Predicate.andএবং Predicate.negate()। এটি ওভারহেড ছাড়াই একত্রিত করে Predicateভেরিয়েবলগুলি প্রি-ইনিশিয়ালাইজ করতে alwaysTrue()এবং পূর্বাভাস যুক্ত করতে দেয় and। যেহেতু ল্যাম্বদা এক্সপ্রেশনগুলির কোনও অবজেক্ট আইডেন্টিটি গ্যারান্টি নেই, এটি এটির সাথে ব্যর্থ হতে পারে x->true। যাইহোক, যদি আমার Xকোনও staticপদ্ধতি সহ ক্লাস থাকে তবে y(){return true;}ব্যবহারের X::yচেয়ে আরও খাটো x->trueতবে সত্যিকারের প্রস্তাবিত নয় ...
হোলগার

10
আইডিয়মের x -> trueঅসুবিধা রয়েছে যে আমাকে ব্যবহার ছাড়াই ভেরিয়েবল ব্যবহার করতে হবে। এটি অপ্রয়োজনীয় মস্তিষ্কের বোঝা এবং আমার আইডিইতে একটি সতর্কতা তৈরি করে। আমি ব্যবহার করার চেষ্টা করেছি _ -> true, কিন্তু এটি একটি সিনট্যাক্স ত্রুটি। জাভা অবশ্যই "অব্যবহৃত প্যারামিটার" এর জন্য একটি কীওয়ার্ড (পড়ুন: কীলেটটার) অনুপস্থিত। আশা করি জাভা 9-এ এই জাতীয় কিছু আসবে (বা কমপক্ষে: আমার মৃত্যুর আগে জাভা যাই হোক ^^)
কেপ

4

পেয়ারা ছাড়া

Boolean.TRUE::booleanValue

3
ইহা আকর্ষণীয়. আমি নিশ্চিত নই যে এটি সম্পূর্ণরূপে অনুরোধের স্পিরিটটি ক্যাপচার করে কিনা, তবে এটি সৃজনশীলতার জন্য পয়েন্ট পায়!
গ্যারেট উইলসন

21
তবে এটি Predicateকোনও নয়, কারণ এটি কোনও যুক্তি গ্রহণ করে না।
ফ্লোরেন্ট

1
এটি কোনও শিকারী নয়, এটি একটি পদ্ধতির রেফারেন্স তবে এতে সংক্ষিপ্ত হওয়ার যোগ্যতা রয়েছে এবং অব্যবহৃত প্যারামিটার উল্লেখ করার জন্য জোর করে না। +1 যাইহোক, এটি পেয়ারা ব্যবহার করা এড়িয়ে যায় যা
মডুলারিটির

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