2016-03-02 24 views
33

मैं निम्नलिखित अभिव्यक्ति है:जावा 8 स्ट्रीम - जाँच लें कि instanceof

scheduleIntervalContainers.stream() 
     .filter(sic -> ((ScheduleIntervalContainer)sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime()) 
     .collect(Collectors.toList()); 

जहां scheduleIntervalContainers प्रकार ScheduleContainer

final List<ScheduleContainer> scheduleIntervalContainers 

की है वहाँ फिल्टर से पहले प्रकार की जांच के लिए एक posibility है?

उत्तर

43

आपको केवल ScheduleIntervalContainer उदाहरणों रखने के लिए एक और filter आवेदन कर सकते हैं, और एक map जोड़ने आप बाद में डाले बचत होगी:

scheduleIntervalContainers.stream() 
    .filter(sc -> sc instanceof ScheduleIntervalContainer) 
    .map (sc -> (ScheduleIntervalContainer) sc) 
    .filter(sic -> sic.getStartTime() != sic.getEndTime()) 
    .collect(Collectors.toList()); 
+59

या '.filter (ScheduleIntervalContainer.class :: isInstance) .map (ScheduleIntervalContainer.class :: cast) ', जो भी शैली आप पसंद करते हैं, से यह समाधान सीखा है। – Holger

56

एक सुंदर सुंदर विकल्प वर्ग की विधि संदर्भ का उपयोग करना है:

दोनों filter और map में टाइपिंग वर्ग के नाम है त्रुटि प्रवण - - है आसान cH तक भूल जाते हैं यह
scheduleIntervalContainers 
    .stream() 
    .filter(ScheduleIntervalContainer.class::isInstance) 
    .map(ScheduleIntervalContainer.class::cast) 
    .filter(sic -> sic.getStartTime() != sic.getEndTime()) 
    .collect(Collectors.toList()); 
9

वहाँ @Eran समाधान के साथ एक छोटी सी समस्या है दोनों जगहों पर कक्षा का नाम एंज करें।

private static <T, R> Function<T, Stream<R>> select(Class<R> clazz) { 
    return e -> clazz.isInstance(e) ? Stream.of(clazz.cast(e)) : null; 
} 

scheduleIntervalContainers 
    .stream() 
    .flatMap(select(ScheduleIntervalContainer.class)) 
    .filter(sic -> sic.getStartTime() != sic.getEndTime()) 
    .collect(Collectors.toList()); 

लेकिन वहाँ हर मिलान तत्व के लिए एक Stream बनाने में निष्पादन दंड हो सकता है: एक बेहतर समाधान कुछ इस तरह होगा। विशाल डेटा सेट पर इसका उपयोग करने के लिए सावधान रहें। मैंने इस समाधान को @Tagir Vailev

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