জাভা 8 জেডিকে ব্যবহার করে আইটেমারে স্ট্রিমে রূপান্তর


418

আমার একটি ইন্টারফেস আছে যা ফিরে আসে java.lang.Iterable<T>

আমি জাভা 8 স্ট্রিম এপিআই ব্যবহার করে সেই ফলাফলটি চালিত করতে চাই।

তবে ইটারেবল "স্ট্রিম" করতে পারবেন না।

কোনও ধারণা কীভাবে ইটেটেবলকে তালিকায় রূপান্তর না করে স্ট্রিম হিসাবে ব্যবহার করবেন?


2
যদি আপনি পুনরাবৃত্তি করতে পারেন, তবে কেন একই সাথে লুপটি এর অবস্থা বা মান বা এতদূর যাচাই করতে ব্যবহার করবেন না?
আফজাল আহমেদ জিশান

26
@ আফজালআহমাদজেশন কারণ স্ট্রিমগুলি আরও ভাল
স্লেমন জেনিদি

1
যেমনটি আমি বলেছি, সেই তালিকায় আমার কিছু হস্তক্ষেপ করা প্রয়োজন (ফিল্টার, ম্যাপিং)। আমি নতুন জাভা 8 জেডিকে এপিআই -> স্ট্রিম ব্যবহার করতে চাই। তবে ইটেয়ারেবল "স্টিমএবল"
রাইমান

অদ্ভুত মনে হচ্ছে যার myIterable.stream()অস্তিত্ব নেই!
জোশ এম

7
@ গুইলুম: হ্যাঁ, তবে Stream.of(iterable)উত্পাদন করে Stream<Iterable<Object>>
ম্যাথিয়াস ব্রাউন

উত্তর:


571

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

StreamSupport.stream(iterable.spliterator(), false)
             .filter(...)
             .moreStreamOps(...);

যেমন আপনি দেখতে পাচ্ছেন, একটি থেকে একটি স্ট্রিম পাওয়া Iterable(এটিও এই প্রশ্নটি দেখুন ) খুব বেদনাদায়ক নয়।


109
উপর একটি স্থিতিশীল পদ্ধতি দুর্দান্ত ছিল Stream, যেমন Stream.ofIterable(iterable)

59
@robinst এটি কোনও ভুল ছিল না; এটি একটি ইচ্ছাকৃত (এবং অত্যন্ত বিতর্কিত) পছন্দ ছিল। চ্যালেঞ্জটি হ'ল এটির অস্তিত্ব ছিল, এটির সাথে আসা ট্রেডঅফগুলি না বুঝে এটির পক্ষে পৌঁছানো খুব সহজ হবে। যেহেতু ইটেবারেবলটি বিমূর্ত, তাই এ জাতীয় পদ্ধতির ফলে সবচেয়ে খারাপ-সম্পাদনকারী স্ট্রিম সম্ভব হয় (কোনও সমান্তরাল সমর্থন, কোনও আকারের তথ্য বা বৈশিষ্ট্য (মৃত্যুদন্ডের পছন্দগুলি অপ্টিমাইজ করার জন্য ব্যবহৃত হয় না))। পুরো ইকোসিস্টেম জুড়ে আরও ভাল এপিআইগুলিতে আরও চিন্তার ফলাফল জোর করা। এটি "এক্সওয়াইজেড কোডের জন্য কী সেরা" বনাম "সমস্ত জাভা কোডের জন্য সবচেয়ে ভাল" এর ট্রেড অফ ছিল।
ব্রায়ান গোয়েট

2
আপনার ব্যাখ্যার উপর ভিত্তি করে, আমি কৌতূহল করছি কেন আমরা সংগ্রহ.স্ট্রিম () পেয়েছি তবে Iterable.stream () নই। দেখে মনে হচ্ছে Iterable.stream () (বা স্ট্রিম.ওফিটেরেবল ()) বাদ দেওয়ার যুক্তিটি সংগ্রহ.স্ট্রিম () তে সমানভাবে প্রযোজ্য।
কোয়ালিডাফিয়াল


11
@ ব্রায়ানগোয়েজ দেখে মনে হচ্ছে বেশিরভাগ লোকেরা আপনার উপরে যে কথাটি বলেছেন তা বোঝার স্তরটিতে নেই বা যত্ন করছেন না। তারা কেবল সাধারণ এপিআই কল করে সাধারণ কোডটি লিখতে চায়। অন্যদিকে, daily জিনিসগুলি (সমান্তরাল ...) বেশিরভাগ দৈনিক পুনরাবৃত্তীয় ক্রিয়াকলাপগুলির পক্ষে গুরুত্বপূর্ণ নয়।
ব্যবহারকারী_3380739

71

আপনি যদি 21 সংস্করণ থেকে পেয়ারা গ্রন্থাগারটি ব্যবহার করতে পারেন তবে আপনি এটি ব্যবহার করতে পারেন

Streams.stream(iterable)

2
অথবা, আপনি যদি কোনও পুরানো সংস্করণে আটকে থাকেন তবে ব্যবহার করুন Lists.newArrayList(Iterable)
জ্যাকব ভ্যান লিনজেন

1
বর্তমান পেয়ারা বাস্তবায়ন গৃহীত উত্তর চেয়ে খারাপ নয়: github.com/google/guava/blob/master/guava/src/com/google/common/...
Vadzim

23

সহজেই আপনি একটি তৈরি করতে পারেন Streamএকটি আউট Iterableবা Iterator:

public static <T> Stream<T> stream(Iterable<T> iterable) {
    return StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(
            iterable.iterator(),
            Spliterator.ORDERED
        ),
        false
    );
}

2
আপনাকে এই ফাংশনটি একবার লিখতে হবে এবং তারপরে কেবল এটি কল করতে হবে। কেন একটি কল stream(...)আপনার কোডের বিশৃঙ্খলা করতে পারে ?
জেক্সিকাইড

1
এটি ইনলাইন সংক্ষিপ্ত এবং মার্জিত করতে চেয়েছিল .. আপনি ঠিকই আমি এই ফাংশনটি একবার লিখতে পারি .. তবে আমি ড্রপিং কোডে (এবং কোড যুক্ত করছি না) am যাইহোক এই উত্তরটি ঠিক কারণ এটি রূপান্তর করার উপায়টি।
রায়মান

স্থিতিশীল আমদানি ফাংশন। সংক্ষিপ্ত এবং মার্জিত। (যদিও অগত্যা স্বচ্ছ নয়)
এপুরিনিট

9

আমি JOOL লাইব্রেরি ব্যবহার করার পরামর্শ দিতে চাই , এটি Seq.seq (পুনরাবৃত্ত) কলের পিছনে স্প্লিটেটর জাদু লুকায় এবং অতিরিক্ত দরকারী কার্যকারিতা পুরো গুচ্ছ সরবরাহ করে।


7

সুতরাং উল্লিখিত অন্য উত্তর হিসাবে পেয়ারা ব্যবহার করে এর জন্য সমর্থন করেছেন:

Streams.stream(iterable);

আমি হাইলাইট করতে চাই যে প্রয়োগগুলি প্রস্তাবিত অন্যান্য উত্তরের তুলনায় কিছুটা পৃথক করে। যদি Iterableটাইপ হয় Collectionতারা এটিকে ফেলে দেয়।

public static <T> Stream<T> stream(Iterable<T> iterable) {
  return (iterable instanceof Collection)
    ? ((Collection<T>) iterable).stream()
    : StreamSupport.stream(iterable.spliterator(), false);
}

public static <T> Stream<T> stream(Iterator<T> iterator) {
  return StreamSupport.stream(
    Spliterators.spliteratorUnknownSize(iterator, 0),
    false
  );
}

5

আমি এই ক্লাসটি তৈরি করেছি:

public class Streams {
    /**
     * Converts Iterable to stream
     */
    public static <T> Stream<T>  streamOf(final Iterable<T> iterable) {
        return toStream(iterable, false);
    }

    /**
     * Converts Iterable to parallel stream
     */
    public static <T> Stream<T> parallelStreamOf(final Iterable<T> iterable) {
        return toStream(iterable, true);
    }

    private static <T> Stream<T> toStream(final Iterable<T> iterable, final boolean isParallel) {
        return StreamSupport.stream(iterable.spliterator(), isParallel);
    }
}

আমি মনে করি এটি নিখুঁতভাবে পঠনযোগ্য কারণ আপনাকে স্প্লিটেটরেটর এবং বুলিয়ানস (ইস্পেরালাল) সম্পর্কে ভাবার দরকার নেই।


4

এই ইস্যুটির জন্য খুব সাধারণ কাজটি হ'ল এমন একটি Streamable<T>ইন্টারফেস তৈরি করা যা Iterable<T>একটি default <T> stream()পদ্ধতি রাখে ।

interface Streamable<T> extends Iterable<T> {
    default Stream<T> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
}

এখন আপনার যে কোনও Iterable<T>এসকে implements Streamable<T>পরিবর্তে ডিক্লেয়ার করে তুচ্ছভাবে স্ট্রিমেবল তৈরি করা যেতে পারে Iterable<T>



-1

জাভা 8 এবং বাহ্যিক libs ছাড়াই এটি করার আরেকটি উপায়:

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