সংখ্যা 0 সমান হলে আমি কীভাবে একটি স্রোতের সাথে সীমা (নম্বর) কলটি এড়িয়ে যেতে পারি?


19

আমার কাছে কিছু জাভা কোড রয়েছে যা থেকে পণ্যগুলি সরবরাহ করে items। এটি তাদের উপর ভিত্তি করে সীমাবদ্ধ করে maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

এটি সঠিকভাবে কাজ করে, তবে প্রশ্নটি হ'ল: যখন সীমাবদ্ধতা এড়ানোর কোনও উপায় আছে maxNumber == 0?

আমি জানি আমি এটি করতে পারি:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

তবে সম্ভবত এর থেকে আরও ভাল উপায় আছে, আপনার মনে কি কিছু আসে?

উত্তর:


15

আমি মনে করি

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

কৌতুকটি করবে, কারণ আপনি 2 ^ 63-1 টিরও বেশি উপাদান দিয়ে কোনও স্রোতকে মোকাবেলা করতে যাচ্ছেন না এমন সম্ভাবনা খুব সম্ভবত ...

কমপক্ষে এটিতে সমান্তরাল স্ট্রিমগুলি সম্পর্কে সতর্কতা অবলম্বন করুন ... এপিআই ডক্সে একটি নোট বলে:

এপিআই দ্রষ্টব্য : limit()সাধারণত সিক্যুয়াল স্ট্রিম পাইপলাইনগুলিতে সস্তা অপারেশন হলেও অর্ডার করা সমান্তরাল পাইপলাইনগুলিতে এটি বেশ ব্যয়বহুল হতে পারে, বিশেষত ম্যাক্স সাইজের বৃহত মানগুলির জন্য ...


হ্যাঁ, যে কৌশলটি করেছেন, ধন্যবাদ!
এলোমেলো ব্যবহারকারী 1

20

না, স্ট্রিম পাইপলাইনটি আসলে পাইপলাইনের কোনও অংশকে এড়িয়ে যাওয়ার অনুমতি দেয় না , সুতরাং আপনি পদক্ষেপের ভিতরে এবং limit()পাইপলাইনের সর্বদা সহ শর্তাধীন যুক্তি দিয়ে কাজ করতে বাধ্য হন বা অংশটি স্ট্রিম তৈরি করতে বাধ্য হন যা যদি / অন্য প্রশ্নের মধ্যে থাকে তার চেয়ে কিছুটা আরও সুস্পষ্ট (আইএমএইচও)

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

এখানকার মতো সাধারণ ক্ষেত্রে এটি খুব বেশি পার্থক্য রাখে না, তবে আপনি প্রায়শই নিয়মিত কোড সংগ্রহগুলি পদ্ধতিগুলির মধ্য দিয়ে প্রবাহিত হয়ে স্ট্রিমিতে রূপান্তরিত এবং তারপরে সংগ্রহগুলিতে ফিরে যেতে দেখেন। এই ধরনের ক্ষেত্রে অংশগুলির স্ট্রিমগুলির সাথে কাজ করা আপনার সত্যিকারের প্রয়োজন না হওয়া পর্যন্ত এটি ভাল ধারণা হতে পারে collect()

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