একটি জাভা 8 স্ট্রিমকে কীভাবে অ্যারেতে রূপান্তর করবেন?


775

একটি জাভা 8 এ Streamঅ্যারে রূপান্তর করার সবচেয়ে সহজ / সংক্ষিপ্ততম উপায় কী ?


2
প্রশ্নটি আরও সম্পূর্ণ হওয়ায় আপনি রোলব্যাকটি ফিরিয়ে দেওয়ার পরামর্শ দিচ্ছি এবং দেখিয়েছি যে আপনি কিছু চেষ্টা করেছেন।
স্কিভি

2
@ এসকিউ ধন্যবাদ! তবে আমি ভেবেছিলাম চেষ্টা করা কোডটি সত্যিকার অর্থে প্রশ্নটিতে আরও তথ্য যুক্ত করে না, এবং কেউ "এখনও আপনার চেষ্টা দেখান" চেঁচিয়ে

17
@ স্কিভি: যদিও আমি সাধারণত আমার পরিবর্তে-আমার-হোম-ওয়ার্ক সংক্রান্ত প্রশ্নগুলিতে চিৎকার করি, তবে এই বিশেষ প্রশ্নটি আমার কাছে কোনও অতিরিক্ত গণ্ডগোল ছাড়াই আরও স্পষ্ট বলে মনে হচ্ছে। এটাকে পরিপাটি করে রাখি।
হনজা জিদেক

উত্তর:


1168

toArray(IntFunction<A[]> generator)অ্যারে কনস্ট্রাক্টর রেফারেন্স সহ পদ্ধতিটি ব্যবহার করা সবচেয়ে সহজ পদ্ধতি । পদ্ধতিটির জন্য এপিআই ডকুমেন্টেশনে এটি প্রস্তাবিত ।

String[] stringArray = stringStream.toArray(String[]::new);

এটি যা করে তা এমন একটি পদ্ধতি খুঁজে পাওয়া যায় যা একটি পূর্ণসংখ্যার (আকার )টিকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং ফিরে আসে String[], যা হ'ল (এর ওভারলোডগুলির মধ্যে একটি) কী new String[]করে।

আপনি নিজের লেখাও লিখতে পারেন IntFunction:

Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);

এর উদ্দেশ্য IntFunction<A[]> generatorহ'ল একটি পূর্ণসংখ্যা, অ্যারের আকারকে নতুন অ্যারে রূপান্তর করা।

উদাহরণ কোড:

Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);

ছাপে:

a
b
c

8
এবং এখানে একটি ব্যাখ্যা কেন এবং কিভাবে এরে কন্সট্রাকটর রেফারেন্স আসলে কাজ: stackoverflow.com/questions/29447561/...
jarek.jpa

"জেনেক্সার ঠিক আছে, সমাধানটি হওয়া উচিত: प्रवाह.toArray (স্ট্রিং [] :: নতুন);" ... ঠিক আছে, তবে একটি বুঝতে হবে যে পদ্ধতিটি উল্লেখটি যুক্তিযুক্ত এবং কার্যকরীভাবে সমতুল্য toArray(sz -> new String[sz])তাই আমি নিশ্চিত নই যে সমাধানটি কী হওয়া উচিত বা হওয়া উচিত তা সত্যই কেউ বলতে পারেন can
স্কটব

3
@ স্কটব sz -> new String[sz]একটি নতুন ফাংশন তৈরি করে যেখানে কনস্ট্রাক্টর হিসাবে উল্লেখটি দেয় না। এটি নির্ভর করে আপনি আবর্জনা সংগ্রহের মন্থনকে কতটা মূল্য দেন।
ওয়ার্ল্ডএসএস

3
@ ওয়ার্মসএস এটি পছন্দ করে না এটি (স্থিতিশীলভাবে!) একটি নতুন, private পদ্ধতি তৈরি করে , যা মন্থনের কারণ হতে পারে না এবং উভয় সংস্করণে একটি নতুন অবজেক্ট তৈরি করা দরকার। একটি রেফারেন্স একটি অবজেক্ট তৈরি করে যা সরাসরি লক্ষ্য পদ্ধতিতে পয়েন্ট করে; একটি ল্যাম্বদা এমন একটি বস্তু তৈরি করে যা উত্পন্নকে লক্ষ্য করে private। ইন্ডিरेশন এবং সহজ ভিএম অপ্টিমাইজেশনের অভাবের জন্য কোনও কনস্ট্রাক্টরের একটি রেফারেন্স এখনও আরও ভাল সঞ্চালন করা উচিত, তবে মন্থনের সাথে এর কোনও যোগসূত্র নেই।
HTNW

2
@ এইচটিএনডাব্লু আপনি সঠিক, আমার ক্ষমা চাই। এটি আমার ডিবাগ করার প্রয়াসটি ছিল যা প্রথমবার এটি করার চেষ্টা করে মন্থনের কারণ হয়ে দাঁড় করিয়েছিল, তাই আমি এটি আমার মাথায় আটকে রেখেছিলাম যে এটি এটিই ছিল। (যে যখন এটি ঘৃণা করি).
ওয়ার্ল্ডএসএস

41

আপনি যদি একটি স্ট্রিম থেকে 1 থেকে 10 এর মানগুলি সহ কোনও ক্রেটের অ্যারে পেতে চান তবে আপনার নিষ্পত্তিস্থলে ইন্টারস্ট্রিম রয়েছে।

এখানে আমরা একটি স্ট্রিম.এফ পদ্ধতি সহ একটি স্ট্রিম তৈরি করি এবং একটি স্ট্রিমকে একটি মানচিত্রোইন্ট ব্যবহার করে একটি স্ট্রিমকে একটি ইন্টারস্ট্রিমে রূপান্তর করি। তারপরে আমরা ইন্টস্ট্রিমের টুআরাই পদ্ধতিতে কল করতে পারি।

Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream 
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array =  stream.mapToInt(x -> x).toArray();

এখানে কেবল স্ট্রিম ছাড়াই কেবল ইন্টারস্ট্রিম ব্যবহার করা হচ্ছে

int[]array2 =  IntStream.rangeClosed(1, 10).toArray();

15

আপনি এই সাধারণ কোড ব্লকটি ব্যবহার করে একটি জাভা 8 স্ট্রিমটিকে একটি অ্যারেতে রূপান্তর করতে পারেন:

 String[] myNewArray3 = myNewStream.toArray(String[]::new);

তবে আসুন বিষয়গুলি আরও ব্যাখ্যা করুন, প্রথমে তিনটি মানের ভরা স্ট্রিংয়ের একটি তালিকা তৈরি করুন:

String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};

প্রদত্ত অ্যারে থেকে একটি স্ট্রিম তৈরি করুন:

Stream<String> stringStream = Arrays.stream(stringList);

আমরা এখন এই স্ট্রিমে কিছু অপারেশন করতে পারি প্রাক্তন:

Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());

এবং অবশেষে এই পদ্ধতিগুলি ব্যবহার করে এটি একটি জাভা 8 অ্যারেতে রূপান্তর করুন:

1-ক্লাসিক পদ্ধতি (কার্যকরী ইন্টারফেস)

IntFunction<String[]> intFunction = new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
};


String[] myNewArray = myNewStream.toArray(intFunction);

2-লাম্বদা এক্সপ্রেশন

 String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);

3- পদ্ধতি রেফারেন্স

String[] myNewArray3 = myNewStream.toArray(String[]::new);

পদ্ধতি রেফারেন্স ব্যাখ্যা:

এটি ল্যাম্বডা এক্সপ্রেশন লেখার অন্য উপায় যা এটি অন্যটির সাথে কঠোরভাবে সমান।


6

পাঠ্যটিকে স্ট্রিং অ্যারে রূপান্তর করুন যেখানে কমা দ্বারা প্রতিটি মান পৃথক করে এবং প্রতিটি ক্ষেত্রকে ছাঁটাই করুন, উদাহরণস্বরূপ:

String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

4

আপনি একটি কাস্টম সংগ্রাহক তৈরি করতে পারেন যা একটি স্ট্রিমকে অ্যারেতে রূপান্তর করে।

public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
    return Collectors.collectingAndThen( 
                  Collectors.toList(), 
                  list ->list.toArray( converter.apply( list.size() ) ) );
}

এবং একটি দ্রুত ব্যবহার

List<String> input = Arrays.asList( ..... );

String[] result = input.stream().
         .collect( CustomCollectors.**toArray**( String[]::new ) );

5
আপনি স্ট্রিম.টোআর্রে (ইনটফানশন) এর পরিবর্তে কেন এটি ব্যবহার করবেন ?
দিদিয়ার এল

আমার কাছে 2-আরগ Collectors.groupingByএ যাওয়ার জন্য একজন সংগ্রাহকের দরকার ছিল যাতে আমি বৈশিষ্ট্যটির মান অনুসারে অবজেক্টের অ্যারেতে কিছু বৈশিষ্ট্য ম্যাপ করতে পারি। এই উত্তরটি আমাকে ঠিক তা দেয়। এছাড়াও @ ডিডিএরএল।
ওলে ভিভি

3

ব্যবহার করে toArray(IntFunction<A[]> generator)পদ্ধতিটি করা প্রকৃতপক্ষে একটি স্ট্রিমকে একই ধরণের স্ট্রিমের একটি অ্যারে রূপান্তরিত করার জন্য একটি খুব মার্জিত এবং নিরাপদ উপায়।

তবে, যদি ফিরে আসা অ্যারের প্রকারটি গুরুত্বপূর্ণ না হয় তবে কেবল toArray()পদ্ধতিটি ব্যবহার করা সহজ এবং খাটো উভয়ই । উদাহরণ স্বরূপ:

    Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());


0
import java.util.List;
import java.util.stream.Stream;

class Main {

    public static void main(String[] args) {
        // Create a stream of strings from list of strings
        Stream<String> myStreamOfStrings = List.of("lala", "foo", "bar").stream();

        // Convert stream to array by using toArray method
        String[] myArrayOfStrings = myStreamOfStrings.toArray(String[]::new);

        // Print results
        for (String string : myArrayOfStrings) {
            System.out.println(string);
        }
    }
}

এটি অনলাইনে ব্যবহার করে দেখুন: https://repl.it/@SmaMa/Stream-to-array


আপনার উত্তর এবং গৃহীত উত্তরের মধ্যে পার্থক্য কী?
লং এনগুইন

@ লংনগুইয়েন এটি একটি সম্পূর্ণ উদাহরণ যেমন একটি অনলাইন রিপ্লে দৃশ্যের, কেবল একটি স্নিপেট সহ।
এসএমএ মা


-2

আপনি এটি কয়েকটি উপায়ে করতে পারেন ll সমস্ত উপায় প্রযুক্তিগতভাবে একই তবে ল্যাম্বদা ব্যবহার করে কিছু কোড সহজতর হবে। আসুন আমরা স্ট্রিং দিয়ে প্রথমে একটি তালিকা শুরু করি, ব্যক্তি হিসাবে এটি বলি Le

List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();

এখন আপনি নিম্নলিখিত যে কোনও একটি ব্যবহার করতে পারেন।

  1. সংজ্ঞায়িত আকারের সাথে একটি নতুন স্ট্রিংআরে তৈরি করতে লাম্বদা এক্সপ্রেসিওন ব্যবহার করে।

    স্ট্রিং [] স্ট্রিংআরে = স্ট্রিম. টো অ্যারে (সাইজ-> নতুন স্ট্রিং [আকার]);

  2. পদ্ধতি রেফারেন্স সরাসরি ব্যবহার।

    স্ট্রিং [] স্ট্রিংআরে = স্ট্রিম.টোআরে (স্ট্রিং [] :: নতুন);

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