আমার যদি কোনও সংগ্রহ থাকে, যেমন Collection<String> strs
, আমি কীভাবে প্রথম জিনিসটি বের করতে পারি? আমি কেবল একটি কল করতে পারি Iterator
, এটি প্রথম নিতে next()
, তারপরে Iterator
দূরে ফেলে দিতে পারি। এটি করার কোনও কম অপচয় করার উপায় কী?
আমার যদি কোনও সংগ্রহ থাকে, যেমন Collection<String> strs
, আমি কীভাবে প্রথম জিনিসটি বের করতে পারি? আমি কেবল একটি কল করতে পারি Iterator
, এটি প্রথম নিতে next()
, তারপরে Iterator
দূরে ফেলে দিতে পারি। এটি করার কোনও কম অপচয় করার উপায় কী?
উত্তর:
Iterables.get (আপনার সি, সূচক ইউয়ান্ট)
কারণ সত্যই, আপনি যদি সংগ্রহগুলি ব্যবহার করছেন তবে আপনার Google সংগ্রহগুলি ব্যবহার করা উচিত।
দেখে মনে হচ্ছে এটি করার সর্বোত্তম উপায়:
String first = strs.iterator().next();
দুর্দান্ত প্রশ্ন ... প্রথমে এটি মনে হয় একটি পর্যবেক্ষণের মতো Collection
ইন্টারফেসের ।
মনে রাখবেন যে "প্রথম" আপনার সংগ্রহের মধ্যে রাখা প্রথম জিনিসটি সর্বদা ফিরে আসবে না এবং কেবলমাত্র অর্ডার করা সংগ্রহের জন্য অর্থবোধ করতে পারে। সম্ভবত সেই কারণেই কোনও get(item)
কল নেই, যেহেতু আদেশটি অগত্যা সংরক্ষণ করা যায় না।
যদিও এটি কিছুটা অপব্যয়কর বলে মনে হচ্ছে, এটি আপনার মনে হয় তত খারাপ নাও হতে পারে। Iterator
সত্যিই ঠিক সংগ্রহ, না একটি সাধারণত একটি সম্পূর্ণ সংগ্রহ কপি মধ্যে ইন্ডেক্স তথ্য উপস্থিত রয়েছে। এই পদ্ধতিটি চালনা করা Iterator
বস্তুটি তাত্ক্ষণিক করে তোলে তবে এটি সত্যই একমাত্র ওভারহেড (সমস্ত উপাদান অনুলিপি করার মতো নয়)।
উদাহরণস্বরূপ, ArrayList<String>.iterator()
পদ্ধতিটি দ্বারা প্রত্যাবর্তিত প্রকারের দিকে তাকালে আমরা দেখতে পাই যে এটি isArrayList::Itr
। এটি একটি অভ্যন্তরীণ শ্রেণী যা কেবল তালিকার উপাদানগুলিকে অনুলিপি না করে সরাসরি অ্যাক্সেস করে।
কেবল নিশ্চিত হয়ে নিন iterator()
যেহেতু এটি খালি হতে পারে বা null
বাস্তবায়নের উপর নির্ভর করে আপনি তার ফেরত পরীক্ষা করেছেন check
জাভা 8:
Optional<String> firstElement = collection.stream().findFirst();
জাভা-র পুরানো সংস্করণগুলির জন্য পেয়ারা ইটারেবলস- এ একটি getFirst পদ্ধতি রয়েছে :
Iterables.getFirst(iterable, defaultValue)
getFirst
পদ্ধতি নেই। রয়েছে get
এবং getLast
পদ্ধতিগুলি
Collection
এটিতে "প্রথম" আইটেমের মতো কোনও জিনিস নেই কারণ এটি কেবল একটি সংগ্রহ।
জাভা ডকের কালেকশন.ইয়েটার () পদ্ধতি থেকে:
যে উপাদানগুলিতে উপাদানগুলি ফিরে আসে সে সম্পর্কিত কোনও গ্যারান্টি নেই ...
সুতরাং আপনি পারবেন না।
আপনি যদি তালিকার মতো অন্য ইন্টারফেস ব্যবহার করেন তবে আপনি নিম্নলিখিতটি করতে পারেন:
String first = strs.get(0);
তবে সরাসরি কোনও সংগ্রহ থেকে এটি সম্ভব নয়।
get(int n)
Collection
আপনার সংগ্রহটি তালিকার মতো হতে চায় বলে মনে হচ্ছে, তাই আমি প্রস্তাব দিই:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
জাভা 8 আপনার ব্যবহারের জন্য কিছু অনেক অপারেটর, উদাহরণস্বরূপ আছে সীমা
/**
* Operator that limit the total number of items emitted through the pipeline
* Shall print
* [1]
* @throws InterruptedException
*/
@Test
public void limitStream() throws InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
.stream()
.limit(1)
.collect(toList());
System.out.println(list);
}
পেয়ারা একটি সরবরাহ করে onlyElement
Collector
তবে কেবল আপনি যদি সংগ্রহটি ঠিক একটি উপাদান হিসাবে প্রত্যাশা করেন তবে এটি ব্যবহার করুন।
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
আপনি যদি সেখানে কতগুলি উপাদান সম্পর্কে নিশ্চিত না হন তবে ব্যবহার করুন findFirst
।
Optional<String> optionalString = collection.stream().findFirst();
আপনি একটি ingালাই করতে পারেন। উদাহরণস্বরূপ, যদি এই সংজ্ঞাটি সহ একটি পদ্ধতি বিদ্যমান থাকে এবং আপনি জানেন যে এই পদ্ধতিটি একটি তালিকা ফিরিয়ে দিচ্ছে:
Collection<String> getStrings();
এবং এটি আহ্বান করার পরে আপনার প্রথম উপাদানটির প্রয়োজন, আপনি এটি এটি করতে পারেন:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
আপনি যদি জানেন যে সংগ্রহটি একটি সারি, তবে আপনি সংগ্রহটি একটি কাতারে কাস্ট করতে পারেন এবং সহজেই তা পেতে পারেন।
অর্ডারটি পেতে আপনি ব্যবহার করতে পারেন এমন বেশ কয়েকটি কাঠামো রয়েছে তবে আপনার এটিতে কাস্ট করতে হবে।
এটি সম্পূর্ণরূপে নির্ভর করে আপনি কোন প্রয়োগটি ব্যবহার করেছেন, অ্যারেলিস্ট লিঙ্কলিস্ট বা সেটটির অন্যান্য বাস্তবায়ন।
যদি এটি সেট করা থাকে তবে আপনি সরাসরি প্রথম উপাদানটি পেতে পারেন, এটি সংগ্রহের উপরের ট্রিক লুপ হতে পারে, মান 1 এর একটি ভেরিয়েবল তৈরি করতে পারে এবং পতাকাটির মানটি 1 হওয়ার পরে মানটি পেতে পারে সেই লুপটির পরে ব্রেক break
যদি এটি তালিকার বাস্তবায়ন হয় তবে সূচী সংখ্যাটি সংজ্ঞায়িত করে এটি সহজ।
কার্যকরী উপায়:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
উপরের কোড স্নিপেট সংরক্ষণ করুন নালপয়েন্টারএক্সসেপশন এবং সূচিপত্র আউট অফফাউন্ডস এক্সসেপশন থেকে
List<T>
শর্তে যে এটি একটি জন্য কাজ করা উচিত সন্তুষ্ট না Collection<String>
, কিন্তু অবশ্যই যে ব্যবহার সংশোধন করা যেতে পারে এর Collection<T>
অতিরিক্ত পরিবর্তনের সঙ্গে: .map(Collection::stream)
।
আপনি এটি করতে পারেন:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
সংগ্রহের জন্য জাভাদোক নীচে অ্যারেগুলির উপাদানগুলির ক্র্যাটিং অর্ডার দেয়:
যদি এই সংগ্রহটি এর পুনরুক্তকারী দ্বারা উপাদানগুলি কী অর্ডারে ফিরে আসে সে সম্পর্কে কোনও গ্যারান্টি দেয় তবে এই পদ্ধতিটি অবশ্যই একই ক্রমে উপাদানগুলি ফেরত দিতে হবে।