জাভা 8-তে FindAny () এবং FindFirst () এর মধ্যে পার্থক্য


90

আমি সামান্য মধ্যে বিভ্রান্ত করছি Stream#findAny()এবং Stream#findFirst()এর Streamজাভা 8 API- টি।

আমি যেটা বুঝলাম তা হ'ল উভয়ই প্রথম প্রবাহের উপাদানটি স্ট্রিম থেকে ফিরিয়ে দেবে, উদাহরণস্বরূপ, যখন ফিল্টারটির সাথে একত্রে ব্যবহৃত হয়?

তাহলে, একই কাজের জন্য দুটি পদ্ধতি কেন? আমি কিছু অনুপস্থিত করছি?

উত্তর:


92

আমি যা বুঝতে পেরেছি তা হল উভয় প্রবাহ থেকে প্রথম মিলিত উপাদানটি ফিরিয়ে দেবে, উদাহরণস্বরূপ, যখন ফিল্টারের সাথে একত্রে ব্যবহৃত হয়?

এটা সত্যি না. জাভাডোকের মতে Stream#findAny():

স্ট্রিমের কিছু উপাদান Optional<T>বর্ণনাকারী একটি স্ট্রিং বা স্ট্রিমটি খালি থাকলে একটি শূন্য প্রদান করে। এই ক্রিয়াকলাপের আচরণটি স্পষ্টতই নিরপেক্ষবাদী; স্ট্রিমের যে কোনও উপাদান নির্বাচন করতে এটি নিখরচায়। এটি সমান্তরাল ক্রিয়াকলাপগুলিতে সর্বাধিক কর্মক্ষমতা অর্জনের অনুমতি দেয়;Optional<T>

যখন স্ট্রিমের প্রথম উপাদানটি কঠোরভাবে বর্ণনা করে Stream.findFirst()ফিরে আসবে । বর্গ একটি নেই তাই আমি আপনি বোঝানো অনুমান, পদ্ধতি ।Optional<T>Stream.findOne().findFirst()


আমি এখনও বুঝতে পারি না, তাই আপনি যা বলছেন filterতা প্রয়োগ হওয়ার পরেও , findAnyপ্রয়োগকৃত ফিল্টারটির সাথে মেলে না এমন সহ যে কোনও উপাদান ফিরে আসতে পারে?
কোরে টুগেই

@ কোরেতুগায় - না, ফিল্টার পরে, বাকি উপাদানগুলি যা আছে তা findAnyএলোমেলোভাবে (বিশেষতঃ সমান্তরাল স্ট্রিম অপারেশনে) যে কোনও উপাদান থেকে ফিরে আসতে পারে
কৃষ্ণপ্রকাশ 13

46

না, উভয়ই স্ট্রিমের প্রথম উপাদানটি ফেরত দেবে না।

থেকে Stream.findAny()(জোর দেওয়া খনি):

একটি ফেরত পাঠায় Optionalবর্ণনা কিছু উপাদান স্ট্রীমের, অথবা একটি খালি Optionalযদি স্ট্রীম খালি।

এটি একটি শর্ট সার্কিটকারী টার্মিনাল অপারেশন।

এই ক্রিয়াকলাপের আচরণটি স্পষ্টতই নিরপেক্ষবাদী; স্ট্রিমের যে কোনও উপাদান নির্বাচন করতে এটি নিখরচায় । এটি সমান্তরাল ক্রিয়াকলাপগুলিতে সর্বাধিক কর্মক্ষমতা অর্জনের অনুমতি দেয়; ব্যয়টি হ'ল একই উত্সে একাধিক অনুরোধগুলি একই ফলাফলটি না ফেরায়। (যদি কোনও স্থিতিশীল ফলাফল পছন্দ হয় তবে findFirst()পরিবর্তে ব্যবহার করুন))

সুতরাং আরও সহজভাবে বলতে গেলে, এটি স্ট্রিমের প্রথম উপাদানটি চয়ন করতে বা নাও পারে।

বর্তমান ওরাকল সুনির্দিষ্ট বাস্তবায়নের সাথে, আমি বিশ্বাস করি যে এটি অ-সমান্তরাল পাইপলাইনে প্রথম উপাদানটি ফিরে আসবে। তবে, সমান্তরাল পাইপলাইনে, এটি সর্বদা থাকবে না (উদাহরণস্বরূপ কার্যকর করুন System.out.println(IntStream.range(0, 100).parallel().findAny());, OptionalInt[50]আমি যখন এটি চালিয়েছিলাম তখন এটি ফিরে আসে )। যাইহোক, আপনি অবশ্যই এর উপর নির্ভর করবেন না


16

সন্ধানের প্রথমটি স্ট্রিমের প্রথম উপাদানগুলি ফেরত দেয় তবে সন্ধানের যে কোনও স্রোতে যে কোনও উপাদান নির্বাচন করতে মুক্ত।

List<String> lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
List<String> lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");

Optional<String> findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst();
Optional<String> fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny();

System.out.println(findFirst.get()); //Always print David
System.out.println(fidnAny.get()); //Print Jack/Jill/Julia :behavior of this operation is explicitly nondeterministic

1

সমান্তরাল মোডে findAnyগ্যারান্টিযুক্ত অর্ডার দেয় না, তবেfindFirst করে।

আমি কিছু কোড স্নিপেট লিখেছি পার্থক্যটি দেখানোর জন্য, এটি দেখুন


1

স্ট্রিম ফাইন্ড ফার্স্ট এবং ফাইন্ডে যে কোনও প্রথম উপাদান ফিরে আসে এবং বাকীটি কার্যকর করে না তবে সমান্তরাল স্ট্রিমে অর্ডার বলতে পারা যায় না এবং সমান্তরাল স্ট্রিম বাকী সংগ্রহটি কার্যকর করে।

রেফারেন্স

সময় 1:25:00


1

আমি শুধু বলতে করবে হুঁশিয়ার findFirst()আর findAny()যখন ব্যবহার করে।

তাদের জাভাডোকের হিসাবে ( এখানে এবং এখানে ) উভয় পদ্ধতিই স্ট্রিম থেকে একটি স্বেচ্ছাসেবী উপাদান ফেরত দেয় - যদি না স্ট্রিমের একটি এনকাউন্টার অর্ডার না হয়, সেক্ষেত্রে যে কোনও ক্ষেত্রে findFirst()প্রথম উপাদান ফিরে আসে এবং findAny()কোনও উপাদান ফিরে আসবে।

মনে করুন listISBN এবং বুকের নাম সহ আমাদের কাস্টম রয়েছে। একটি দৃশ্যের জন্য এই উদাহরণটি দেখুন:

public class Solution {
   private Integer ISBN;
   private String BookName;

public Solution(int i, String string) {
    ISBN =i;
    BookName = string;
}
//getters and setters
}

public static void main(String[] args) {
        List<Solution> Library = Arrays.asList(new Solution(12,"Java in Action"),new Solution(13,"Java 8"),new Solution(15,"Java 8 Features"),new Solution(16,"Java in Action"));
 System.out.println(Library.stream()
        .map(p->p.getBookName())
        .sorted(Comparator.reverseOrder())
        .findFirst());
    }

আউটপুট :Optional[Java in Action]

যখন বইয়ের নাম একই হয় তবে আইএসবিএন সংখ্যাগুলি পৃথক হতে পারে এমন পরিস্থিতিতেও থাকতে পারে, সেক্ষেত্রে বইটি বাছাই করা এবং সন্ধান করা অনেকটা অনুরূপ হতে পারে findAny()এবং ভুল ফল দেয়। এমন একটি দৃশ্যের কথা চিন্তা করুন যেখানে 5 টি বইয়ের নাম "জাভা রেফারেন্স" রয়েছে তবে বিভিন্ন আইএসবিএন নম্বর রয়েছে এবং findFirst()নাম অনুসারে বইয়ের ফলাফল একই রকম হবে findAny()

একটি দৃশ্যের কথা চিন্তা করুন যেখানে:

 ISBN    Name Of book
+-----+------------------+
| 100 | Java-8 in Action |
+-----+------------------+
| 101 | Java-8 in Action |
+-----+------------------+
| 102 | Java-8 in Action |
+-----+------------------+
| 103 | Java-8 in Action |
+-----+------------------+
| 104 | Java-8 in Action |
+-----+------------------+

এখানে FindFirst () এবং FindAny () বুকবাইনেমে বাছাই করা হলেও একই ফল দেবে।

বিস্তারিত নিবন্ধ:


-1

যখন Streamunordered, তাই findFirst()এবং findAny()একই। কিন্তু যখন Streamঅর্ডার করা হয়, findAny()আরও ভাল হবে।


এটি ভুল। এই পদ্ধতিগুলির কোনওটিই "ভাল" নয়, কারণ তাদের আচরণ এবং ব্যবহারের ক্ষেত্রেগুলি সম্পূর্ণ আলাদা। এছাড়াও, Stream"অর্ডার" হওয়ার অর্থ কী ? এটি সর্বদা অর্ডার করা হয় ( Streamপ্রতিবার সমান্তরাল না হলে একই ক্রমে প্রদত্ত ক্রিয়াকলাপগুলি কার্যকর করা হয় ), তবে সম্ভবত ব্যবহারকারী দ্বারা বাছাই করা হয়নি।
ইজোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.