मैं एक जावा 8 इंटस्ट्रीम को सूची में कैसे बदलूं?


283

मैं डॉक्स को देख रहा हूं IntStream, और मुझे एक toArrayविधि दिखाई दे रही है , लेकिन सीधे ए पर जाने का कोई तरीका नहीं हैList<Integer>

निश्चित रूप से ए को कन्वर्ट करने का एक तरीका Streamहै List?


इस लिंक को आज़माएं: stackoverflow.com/questions/14830313/…
वैभव जैन

2
@KarlRichter दूसरा प्रश्न आपको टाइप की गई सूची नहीं देता है। इसके अलावा, यह सवाल चार साल पहले से था, और इसका उत्तर 300+ अपवोट्स के साथ है। अब हम इसे मर्ज करने की कोशिश क्यों कर रहे हैं?
एरिक विल्सन

जवाबों:


541

IntStream::boxed

IntStream::boxedएक बदल जाता है IntStreamएक में Stream<Integer>जो आप कर सकते हैं तो, collectएक में List:

theIntStream.boxed().collect(Collectors.toList())

boxedविधि धर्मान्तरित intएक के आदिम मूल्यों IntStreamकी एक धारा में Integerवस्तुओं। शब्द "बॉक्सिंग" नाम intIntegerरूपांतरण प्रक्रिया। ओरेकल ट्यूटोरियल देखें ।


1
@ एस्की मेरा मतलब है, कि इस के बाद अन्य सभी उत्तर अनावश्यक हैं क्योंकि वे इतने स्वाभाविक नहीं होंगे।
दिमित्री गिंजबर्ग

1
धन्यवाद, मैंने अभी तक बॉक्सिंग विधि नहीं देखी थी और यह एक आकर्षण की तरह काम करती थी।
१२:५५ पर twreid

जोड़: मुझे लगता है कि यदि आप एक स्थिर आयात का उपयोग करते हैं तो यह कोड थोड़ा छोटा, स्पष्ट और पूर्व हो जाता है toList। यह फ़ाइल के आयात के बीच निम्नलिखित रखकर किया जाता है static import java.util.stream.Collectors.toList;:। फिर कलेक्ट कॉल सिर्फ पढ़ता है .collect(toList())
Lii

1
ग्रहण में आईडीई को विधियों के लिए एक स्थिर आयात जोड़ना संभव है। यह वरीयताएँ -> जावा -> संपादक -> सामग्री सहायता -> पसंदीदाCollectors में वर्ग को जोड़कर किया जाता है । इसके बाद, आपको IDE को भरने और स्थैतिक आयात को जोड़ने के लिए हिट सीटीआर + स्पेस पर टाइप करना होगा। toLitoList
Lii

2
मेरे बालों को फाड़ रहा था, जो मैंने कोशिश की थी उसके बारे में क्या गलत था, इस boxed()भाग को इंगित करने के लिए धन्यवाद
के राफेल

16

आप एक स्ट्रीम पर MapToObj () का भी उपयोग कर सकते हैं, जो एक इंटफ़ंक्शन लेता है और इस स्ट्रीम के तत्वों को दिए गए फ़ंक्शन को लागू करने के परिणामों से मिलकर एक ऑब्जेक्ट-वैल्यू स्ट्रीम देता है।

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

4
विडंबना के एक झटके में, यह वही है जो boxed()प्रतिनिधि है।
मकोतो

9

आप ग्रहण संग्रह में उपलब्ध आदिम संग्रह का उपयोग कर सकते हैं और मुक्केबाजी से बच सकते हैं।

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

नोट: मैं कलेक्शन एक्लिप्स का योगदानकर्ता हूं।


6
हालांकि एक्लिप्स कलेक्शन आमतौर पर काफी मददगार होते हैं, लेकिन ऐसा नहीं लगता है कि यह कुछ भी आसान बना रहा है :)
बेन

1
EC 9.0 के बाद से, आप एक आदिम स्ट्रीम से एक आदिम सूची बना सकते हैं। MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
डोनाल्ड रबाब

1
यह वही है जो मैं ढूंढ रहा था .. इंटर्गर या ऑब्जेक्ट पर अंतर धारा को बॉक्सिंग करना अलग बात है
विकाश

2

जावा 8 का उपयोग करते हुए प्रत्येक अंतर तत्व के वर्ग को खोजने का उदाहरण देखें: -

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

0

आप एकत्रित विधि का उपयोग कर सकते हैं:

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

वास्तव में, यह लगभग वैसा ही है जैसा आप कॉल करते समय जावा करते हैं। एक ऑब्जेक्ट स्ट्रीम पर .collect (संग्राहक.toList ()):

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

नोट: तीसरा पैरामीटर केवल तभी आवश्यक है जब आप समानांतर संग्रह चलाना चाहते हैं; अनुक्रमिक संग्रह के लिए सिर्फ पहले दो पर्याप्त होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.