নীচের কোডটিতে আমি কীভাবে একটি স্ট্রিম বা তালিকার শেষ উপাদানটি পেতে পারি?
data.careasএকটি কোথায় List<CArea>:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
আপনি দেখতে পাচ্ছেন যে প্রথম উপাদানটি, একটি নির্দিষ্ট সহ filter, পাওয়া শক্ত নয়।
তবে ওয়ান-লাইনারে শেষ উপাদানটি পাওয়া সত্যিকারের ব্যথা:
- দেখে মনে হচ্ছে আমি এ থেকে সরাসরি এটি পেতে পারি না
Stream। (এটি কেবল সীমাবদ্ধ স্ট্রিমগুলির জন্য অর্থবহ হবে) - এছাড়া মনে হচ্ছে আপনি ভালো জিনিস পেতে পারে না
first()এবংlast()থেকেListইন্টারফেস, যা সত্যিই ব্যাথা হয়।
ইন্টারফেসে একটি first()এবং last()পদ্ধতি সরবরাহ না করার জন্য আমি কোনও যুক্তি দেখতে পাচ্ছি না List, কারণ সেখানে উপাদানগুলি আদেশ করা হয়েছে, এবং এরপরে আকারটিও জানা গেছে।
তবে আসল উত্তর অনুসারে: সসীমের শেষ উপাদানটি কীভাবে পাবেন Stream?
ব্যক্তিগতভাবে, এটি আমার কাছে পাওয়া সবচেয়ে নিকটতম:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
তবে এতে জড়িত থাকে, indexOfপ্রতিটি উপাদান ব্যবহার করে, যা সম্ভবত আপনি চান না কারণ এটি কার্য সম্পাদনকে ক্ষতিগ্রস্থ করতে পারে।
Streamহওয়ায় এপিআই সম্পূর্ণরূপে তুলনীয় নয় LINQ। এটি খারাপ বা আরও ভাল নয় এটি একেবারেই আলাদা। এবং অবশ্যই কিছু পদ্ধতি অনুপস্থিত না কারণ ওরাকল
Iterables.getLastযা গ্রহণযোগ্য হয় তবে এটি কাজ করতে অনুকূল হয়List। একটি পোষা peeve যে এটি নেইgetFirst।Streamসাধারণভাবে এপিআই সুবিধা পদ্ধতি প্রচুর বাদ ভয়ঙ্করভাবে পায়ুসংক্রান্ত হয়। সি # এর লিনক, বিপরীতে, প্রদান করে খুশি.Last()এবং এমনকি.Last(Func<T,Boolean> predicate)এটি অসীম সংখ্যাগুণকে সমর্থন করেও।