স্ট্রিম.এলম্যাচ () খালি স্ট্রিমের জন্য কেন সত্য ফিরে আসে?


84

আমার সহকর্মী এবং আমার একটি বাগ ছিল যা আমাদের অনুমানের কারণেই হয়েছিল যে খালি স্ট্রিম কলিং allMatch()ফিরে আসবে false

if (myItems.allMatch(i -> i.isValid()) { 
    //do something
}

অবশ্যই, ডকুমেন্টেশনগুলি ধরে নেওয়া এবং না পড়ার জন্য এটি আমাদের দোষ। তবে আমি যা বুঝতে পারি না তা হ'ল কেন allMatch()একটি খালি স্ট্রিমের জন্য ডিফল্ট আচরণ true। এর কারণ কী ছিল? ভালো লেগেছে anyMatch()(যা বিপরীতভাবে আয় মিথ্যা), এই অপারেশন একটি অনুজ্ঞাসূচক উপায় যে একসংখ্যা ছাড়বে এবং এটি সম্ভবত একটি ব্যবহৃত ব্যবহার করা হয় ifবিবৃতি। এই ঘটনাগুলি বিবেচনা করে, খালি স্ট্রিমে allMatch()ডিফল্ট trueথাকা বেশিরভাগ ব্যবহারের জন্য কেন আকাঙ্ক্ষার কোনও কারণ আছে ?


4
এটা কিছুটা অদ্ভুত। আমরা প্রত্যাশা করব যে যদি allMatchসত্য হয় তবে তা করা উচিত anyMatch। অতিরিক্তভাবে, খালি ক্ষেত্রে, allMatch(...) == noneMatch(...)যা খুব অদ্ভুত।
রেডিওডেফ

6
উইকিপিডিয়া বলেছেন কনভেনশন হল: en.wikipedia.org/wiki/Universal_quantification#The_empty_set
অ্যালেক্স - GlassEditor.com

সিনট্যাক্স সম্পর্কে কেবল একটি দ্রুত সরাইয়া: আপনার প্রাকটিক হিসাবে লেখার পরিবর্তে i -> i.isValid()আপনি লিখতে পারেন Foo::isValid( Fooআপনি যে শ্রেণীর স্ট্রিমিং অবশ্যই করছেন যেখানে )
ম্যাটপুটনাম

4
"এই অপারেশনটি এক অত্যাবশ্যক পদ্ধতিতে ব্যবহৃত হয় যা মোনাদকে বিদায় দেয়" - আমি কোনও সিদ্ধান্তে এই কারণগুলিকে সন্দেহ করি।
ব্যবহারকারী 253751

উত্তর:


117

এটি শূন্য সত্য হিসাবে পরিচিত । খালি সংগ্রহের সমস্ত সদস্য আপনার শর্ত পূরণ করে; সর্বোপরি, আপনি কি এমন একটিকে নির্দেশ করতে পারেন যা তা নয়?

একইভাবে, anyMatchফেরত দেয় falseকারণ শর্তের সাথে মিলে যায় এমন আপনার সংগ্রহের কোনও উপাদান আপনি খুঁজে পাচ্ছেন না। এটি প্রচুর লোকের কাছে বিভ্রান্তিকর, তবে এটি খালি সেটগুলির জন্য "যে কোনও" এবং "সমস্ত" সংজ্ঞায়িত করার সবচেয়ে দরকারী এবং ধারাবাহিক উপায় হিসাবে দেখা যায়।


4
গীজ, আমি বুলিয়ান যুক্তি ঘৃণা করি। আমি মনে করি আপনি কী বলছেন সে সম্পর্কে আমি ধারণা পেয়েছি। নেতিবাচক অনুপস্থিতি একটি ইতিবাচক, তবে ইতিবাচক অনুপস্থিতি negativeণাত্মক নয়।
tmn

13
@ থমাসএন। একইভাবে সংখ্যার খালি সংখ্যার মান 1যখন হয় খালি সংখ্যার সংখ্যার যোগফল 0। এগুলি হ'ল গুণ / সংযোজনের জন্য নিরপেক্ষ উপাদান। Booleans থেকে যদি আপনি আছে True and x = xএবং False or x = xঅত: পর আপনি সাধারণের যদি andএবং orসিকোয়েন্স থেকে (যে কী allএবং anyহয়) আপনি দিয়ে শেষ Trueএবং Falseখালি মামলা, অর্থাত তারা নিজ নিজ নিরপেক্ষ উপাদান।
বাকুরিউ

9
@ থমাসএন। anyMatchধনাত্মক অনুপস্থিতির জন্য allMatchপরীক্ষা, নেতিবাচক অনুপস্থিতির জন্য পরীক্ষা।
ব্যবহারকারী 253751

4
মনে রাখবেন যে আপনি ডি মরগানের আইনের মতো দুর্দান্ত জিনিসগুলি করতে পারেন: স্ট্রিম.আলম্যাচ (প্রিডিকেট) একই! স্ট্রিম.নেম্যাচ (প্রেডিকেট.নেগেট ())। একইভাবে!
হান্স

4
@ পেট্রিকবার্ড: আপনি বলতে পারেন যে "আপনি যা করতে পারেন তাকে নির্দেশ করতে পারেন", এবং এটি সম্পূর্ণরূপে বৈধ , তবে এর অর্থ হ'ল সংগ্রহের সমস্ত সদস্য শর্ত পূরণ করতে ব্যর্থ হন। সংগ্রহের সমস্ত সদস্য শর্তটি পূরণ করে এবং সংগ্রহের সমস্ত সদস্য শর্তটি পূরণ করতে ব্যর্থ হয়। এগুলি "সংগ্রহের সমস্ত সদস্য শর্তটি পূরণ করে" এটি মিথ্যা from যেমনটি আমি বলেছিলাম, এটি বিভ্রান্তিকর।
ব্যবহারকারী 2357112 1613

10

এটি সম্পর্কে চিন্তা করার অন্য উপায় এখানে:

allMatch()যা হয় &&তা sum()হচ্ছে+

নিম্নলিখিত যৌক্তিক বিবৃতি বিবেচনা করুন:

IntStream.of(1, 2).sum() + 3 == IntStream.of(1, 2, 3).sum()
IntStream.of(1).sum() + 2 == IntStream.of(1, 2).sum()

এটি উপলব্ধি করে কারণ sum()এটি কেবলমাত্র একটি সাধারণীকরণ +। তবে, আপনি যখন আরও একটি উপাদান সরিয়ে ফেলেন তখন কি হবে?

IntStream.of().sum() + 1 == IntStream.of(1).sum()

আমরা দেখতে পাচ্ছি যে এটি IntStream.of().sum()নির্দিষ্ট উপায়ে সংখ্যার খালি অনুক্রমের সংজ্ঞা দেওয়া , বা অর্থের যোগফল বোঝায় । এটি আমাদের সংক্ষেপের "পরিচয় উপাদান" দেয় বা এমন মান দেয় যা কোনও কিছুর সাথে যুক্ত হওয়ার পরে তার কোনও প্রভাব নেই ( 0)।

Booleanবীজগণিতের ক্ষেত্রেও আমরা একই যুক্তি প্রয়োগ করতে পারি ।

Stream.of(true, true).allMatch(it -> it) == Stream.of(true).allMatch(it -> it) && true

আরও উদারভাবে:

stream.concat(Stream.of(thing)).allMatch(it -> it) == stream.allMatch(it -> it) && thing

তবে যদি stream = Stream.of()এই নিয়মটি এখনও প্রয়োগ করা দরকার। এটি সমাধানের জন্য আমরা && এর "পরিচয় উপাদান" ব্যবহার করতে পারি। true && thing == thingতাই Stream.of().allMatch(it -> it) == true


6

আমি যখন কল করি list.allMatch(বা অন্যান্য ভাষায় এর এনালগগুলি) তখন আমি সনাক্ত করতে চাই যে কোনও আইটেম listপ্রিকিকেটের সাথে মেলে না। যদি কোনও আইটেম না থাকে, মেলাতে কেউ ব্যর্থ হতে পারে। আমার নীচের যুক্তি আইটেমগুলি বাছাই করবে এবং তাদের সাথে ভবিষ্যদ্বাণীটির সাথে মিল রয়েছে বলে আশা করবে। খালি তালিকার জন্য, আমি কোনও আইটেম বাছাই করব না এবং যুক্তিটি এখনও দুর্দান্ত থাকবে।

যদি খালি তালিকার জন্য allMatchফিরে আসে false?

আমার সোজাসুজি যুক্তি ব্যর্থ হবে:

 if (!myList.allMatch(predicate)) {
   throw new InvalidDataException("Some of the items failed to match!");
 }
 for (Item item : myList) { ... }

আমার সাথে চেকটি প্রতিস্থাপন করতে হবে !myList.empty() && !myList.allMatch()

সংক্ষেপে, একটি খালি তালিকার জন্য allMatchফিরে আসা trueকেবল যুক্তিযুক্তভাবেই সাবলীল নয়, এটি কার্যকর করার সুখী পথের উপরেও রয়েছে, যার জন্য আরও কম চেক প্রয়োজন।


আপনি সম্ভবত বোঝাতে চেয়েছিলেনif (!allMatch)
অ্যাসিলিয়াস

3

দেখে মনে হচ্ছে এর ভিত্তিটি গাণিতিক আনয়ন। কম্পিউটার বিজ্ঞানের জন্য এটির একটি অ্যাপ্লিকেশন একটি পুনরাবৃত্ত আলগোরিদিমের বেস কেস হতে পারে।

যদি স্ট্রিমটি খালি থাকে তবে পরিমিতিটি শূন্যপদে সন্তুষ্ট বলে মনে হয় এবং সর্বদা সত্য। ওরাকল ডক্স: স্ট্রিম অপারেশন এবং পাইপলাইন

এখানে মূল কীটি এটি "শূন্যপদে সন্তুষ্ট" যা প্রকৃতির দ্বারা কিছুটা বিভ্রান্তিকর। উইকিপিডিয়া এটি সম্পর্কে একটি শালীন আলোচনা আছে।

খাঁটি গণিতে শূন্যপদে সত্য বক্তব্য সাধারণত নিজেরাই আগ্রহী হয় না, তবে গাণিতিক আবেগের দ্বারা প্রমাণগুলির ভিত্তি হিসাবে এটি প্রায়শই উত্থিত হয়। উইকিপিডিয়া: ভ্যাকুয়াস সত্য


1

যদিও এই প্রশ্নের ইতিমধ্যে বহুবার উত্তর দেওয়া হয়েছে, আমি আরও গাণিতিক পদ্ধতির আনতে চাই।

তার জন্য আমি স্ট্রিমটিকে একটি সেট হিসাবে গণ্য করতে চাই (গাণিতিক অর্থে)। তারপর

emptyStream.allMatch(x-> p(x))

কিছু এখানে চিত্র বর্ণনা লিখুনসময়ের সাথে সম্পর্কিত

emtpyStream.anyMatch(x -> p(x))

অনুরূপ এখানে চিত্র বর্ণনা লিখুন

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

এই পার্থক্যটি বোঝানোর জন্য একটি উদাহরণ হ'ল "মঙ্গল গ্রহে বাসকারী সমস্ত মানুষের 3 পা আছে" (সত্য) এবং "মঙ্গল গ্রহে 3 পা দিয়ে একটি মানুষের জীবন আছে" (মিথ্যা)

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