2016-04-27 7 views
18

क्या सरल लैम्ब्डा अभिव्यक्ति का उपयोग कर सरणी या संग्रह को प्रारंभ करने का कोई तरीका है?लेम्बा अभिव्यक्ति सरणी को शुरू करने के लिए

कुछ की तरह

// What about this? 
Person[] persons = new Person[15]; 
persons =() -> {return new Person()}; 

या

// I know, you need to say how many objects 
ArrayList<Person> persons =() -> {return new Person()}; 

उत्तर

23

ज़रूर - मैं नहीं जानता कि यह कितनी उपयोगी है, लेकिन यह निश्चित रूप से संभव है:

import java.util.*; 
import java.util.function.*; 
import java.util.stream.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Supplier<Test> supplier =() -> new Test(); 
     List<Test> list = Stream 
      .generate(supplier) 
      .limit(10) 
      .collect(Collectors.toList()); 
     System.out.println(list.size()); // 10 
     // Prints false, showing it really is calling the supplier 
     // once per iteration. 
     System.out.println(list.get(0) == list.get(1)); 
    } 
} 
+2

या सीधे। जेनरेट (() -> नया टेस्ट()), ओपी द्वारा अनुरोध किए गए लैम्ब्डा ऑपरेटर का उपयोग करने के लिए ... का उपयोग करें। जेनरेट (टेस्ट :: नया)। –

+6

@ जीन-फ्रैंकोइससावर्ड: हाँ, मैं केवल शामिल प्रकारों को दिखाने के लिए घोषणा को अलग कर रहा था। –

3

आप का उपयोग कर इसे प्रारंभ करने में जावा 8 चाहते हैं, आप वास्तव में एक लैम्ब्डा अभिव्यक्ति का उपयोग करने की जरूरत नहीं है। आप प्राप्त कर सकते हैं कि Stream का उपयोग कर:

Stream.of(new Person()).collect(Collectors.toList()); 
+3

मुझे लगता है * ओपी सूची को पॉप्युलेट करने के लिए लैम्ब्डा अभिव्यक्ति को कई बार कॉल करना चाहता है - देखें कि मेरा जवाब आपको समझ में आता है या नहीं। –

+0

@ जोन्सस्केट पूरी तरह से समझ में आता है। – Maroun

+2

यह एक 'व्यक्ति' उदाहरण वाली एक सूची तैयार करेगा, इस प्रकार, यह 'संग्रह। सिंगलेटनलिस्ट (नया व्यक्ति())' – Holger

19

आप पहले से ही एक पूर्व आवंटित सरणी है, तो आप कर सकते हैं Arrays.setAll या Arrays.parallelSetAll का उपयोग कर इसे पॉप्युलेट करने के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग:

Arrays.setAll(persons, i -> new Person()); // i is the array index 

एक नई सरणी बनाने के लिए, आप

उपयोग कर सकते हैं
Person[] persons = IntStream.range(0, 15) // 15 is the size 
    .mapToObj(i -> new Person()) 
    .toArray(Person[]::new); 
संबंधित मुद्दे