2015-11-21 15 views
7

क्या संग्राहकों के लिए मुझे एक पर्यवेक्षित आरेलेलिस्ट लौटना संभव है? इस तरह एक छोटी सी:संग्राहक लैम्बडा लौटने योग्य सूची

ObservableList<String> newList = list.stream(). 
     filter(x -> x.startsWith("a"). 
     collect(Collectors.toCollection(ObservableArrayList::new)); 
+0

तुम सिर्फ यह किया, था ना? – assylias

+1

@assylias नोप, 'ObservableArrayList' के लिए कोई कन्स्ट्रक्टर नहीं है (यह वास्तव में कक्षा नहीं है) – Tunaki

उत्तर

14

ObservableList रों FXCollections वर्ग से स्थिर कारखानों के साथ बनाया जाता है।

आप निम्न कार्य कर सकते हैं, जो पहले स्ट्रीम को List में एकत्र करता है और फिर इसे ObservableList के अंदर लपेटता है।

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.collectingAndThen(toList(), l -> FXCollections.observableArrayList(l))); 

(जो दुर्भाग्य से पर्याप्त ग्रहण मंगल ग्रह 4.5.1 पर संकलन नहीं करता, लेकिन javac 1.8.0_60 पर ठीक संकलित)।

इसके लिए एक कस्टम कलेक्टर बनाने की एक और संभावना है। इसका लाभ यह है कि पहले List का उपयोग करने की आवश्यकता नहीं है। तत्व सीधे ObservableList के अंदर एकत्र किए जाते हैं।

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collector.of(
       FXCollections::observableArrayList, 
       ObservableList::add, 
       (l1, l2) -> { l1.addAll(l2); return l1; }) 
      ); 

लुइस Wasserman in the comments द्वारा बताया गया है, यह पिछले अभिव्यक्ति अधिक बस toCollection का उपयोग कर फिर से लिखा जा सकता है:

ObservableList<String> newList = 
     list.stream() 
      .filter(x -> x.startsWith("a")) 
      .collect(Collectors.toCollection(FXCollections::observableArrayList)); 
+1

कि अंतिम अभिव्यक्ति खराब दिखती है। धन्यवाद – Josephus87

+1

@ जोसेफस 87 स्थिर आयात थोड़ा सा मदद करते हैं। इसके अलावा, मैंने दूसरी संभावना को जोड़ा जो मध्यवर्ती सूची का उपयोग नहीं करता है। – Tunaki

+3

क्यों न केवल 'संग्रह (कोकोलेक्शन (FXCollections :: ObsableArrayList))', जो दोनों समस्याओं को हल करता है? –

संबंधित मुद्दे