একটি জাভা 8 এ Stream
অ্যারে রূপান্তর করার সবচেয়ে সহজ / সংক্ষিপ্ততম উপায় কী ?
একটি জাভা 8 এ Stream
অ্যারে রূপান্তর করার সবচেয়ে সহজ / সংক্ষিপ্ততম উপায় কী ?
উত্তর:
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
toArray(sz -> new String[sz])
তাই আমি নিশ্চিত নই যে সমাধানটি কী হওয়া উচিত বা হওয়া উচিত তা সত্যই কেউ বলতে পারেন can
sz -> new String[sz]
একটি নতুন ফাংশন তৈরি করে যেখানে কনস্ট্রাক্টর হিসাবে উল্লেখটি দেয় না। এটি নির্ভর করে আপনি আবর্জনা সংগ্রহের মন্থনকে কতটা মূল্য দেন।
private
পদ্ধতি তৈরি করে , যা মন্থনের কারণ হতে পারে না এবং উভয় সংস্করণে একটি নতুন অবজেক্ট তৈরি করা দরকার। একটি রেফারেন্স একটি অবজেক্ট তৈরি করে যা সরাসরি লক্ষ্য পদ্ধতিতে পয়েন্ট করে; একটি ল্যাম্বদা এমন একটি বস্তু তৈরি করে যা উত্পন্নকে লক্ষ্য করে private
। ইন্ডিरेশন এবং সহজ ভিএম অপ্টিমাইজেশনের অভাবের জন্য কোনও কনস্ট্রাক্টরের একটি রেফারেন্স এখনও আরও ভাল সঞ্চালন করা উচিত, তবে মন্থনের সাথে এর কোনও যোগসূত্র নেই।
আপনি যদি একটি স্ট্রিম থেকে 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();
আপনি এই সাধারণ কোড ব্লকটি ব্যবহার করে একটি জাভা 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);
পদ্ধতি রেফারেন্স ব্যাখ্যা:
এটি ল্যাম্বডা এক্সপ্রেশন লেখার অন্য উপায় যা এটি অন্যটির সাথে কঠোরভাবে সমান।
পাঠ্যটিকে স্ট্রিং অ্যারে রূপান্তর করুন যেখানে কমা দ্বারা প্রতিটি মান পৃথক করে এবং প্রতিটি ক্ষেত্রকে ছাঁটাই করুন, উদাহরণস্বরূপ:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
আপনি একটি কাস্টম সংগ্রাহক তৈরি করতে পারেন যা একটি স্ট্রিমকে অ্যারেতে রূপান্তর করে।
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 ) );
Collectors.groupingBy
এ যাওয়ার জন্য একজন সংগ্রাহকের দরকার ছিল যাতে আমি বৈশিষ্ট্যটির মান অনুসারে অবজেক্টের অ্যারেতে কিছু বৈশিষ্ট্য ম্যাপ করতে পারি। এই উত্তরটি আমাকে ঠিক তা দেয়। এছাড়াও @ ডিডিএরএল।
ব্যবহার করে toArray(IntFunction<A[]> generator)
পদ্ধতিটি করা প্রকৃতপক্ষে একটি স্ট্রিমকে একই ধরণের স্ট্রিমের একটি অ্যারে রূপান্তরিত করার জন্য একটি খুব মার্জিত এবং নিরাপদ উপায়।
তবে, যদি ফিরে আসা অ্যারের প্রকারটি গুরুত্বপূর্ণ না হয় তবে কেবল toArray()
পদ্ধতিটি ব্যবহার করা সহজ এবং খাটো উভয়ই । উদাহরণ স্বরূপ:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
আপনি এটি কয়েকটি উপায়ে করতে পারেন ll সমস্ত উপায় প্রযুক্তিগতভাবে একই তবে ল্যাম্বদা ব্যবহার করে কিছু কোড সহজতর হবে। আসুন আমরা স্ট্রিং দিয়ে প্রথমে একটি তালিকা শুরু করি, ব্যক্তি হিসাবে এটি বলি Le
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
এখন আপনি নিম্নলিখিত যে কোনও একটি ব্যবহার করতে পারেন।
সংজ্ঞায়িত আকারের সাথে একটি নতুন স্ট্রিংআরে তৈরি করতে লাম্বদা এক্সপ্রেসিওন ব্যবহার করে।
স্ট্রিং [] স্ট্রিংআরে = স্ট্রিম. টো অ্যারে (সাইজ-> নতুন স্ট্রিং [আকার]);
পদ্ধতি রেফারেন্স সরাসরি ব্যবহার।
স্ট্রিং [] স্ট্রিংআরে = স্ট্রিম.টোআরে (স্ট্রিং [] :: নতুন);