2016-03-24 10 views
5

मुझे निम्न कोड मिला, जो किसी सूची में कुछ परिस्थितियों (यदि यह पुराना नहीं है) के तहत एक आइटम जोड़ता है। यह सूची बाद में एक सामान्य नियंत्रण सूची में पैक हो जाती है।जावा 8 धाराओं के साथ एक सूची का रिफैक्टर निर्माण

List<ListDataContent> list = konditionen.stream().map(kondition -> map(tilg, kondition.getChangeDate(), funds)).sorted().collect(Collectors.toList()); 
SimpleListControl listCtrl = new SimpleListControl(); 
listCtrl.setDataModel(new ListDataModel(list)); 

समस्या नक्शा विधि है ...

private TerminKondListContent map(TermKondValue tilg, Date changeDate, BigDecimal funds) { 
    if (kondition.getStatusKz().equals(StatusKz.OLD)) 
     return null; 
    for (TermKondValue zins : kondition.getTerminkonditions()) { 
     if (zins.getStatusKz().equals(StatusKz.OLD)) 
      return null; 

     return new TerminKondListContent(tilg, changeDate, funds); 
    } 
    return null; 
} 

मैं जारी मामलों में क्या कर सकते हैं:

List<ListDataContent> list = new ArrayList<>(); 

    for (KonditionValue kondition : konditions) { 
     if (kondition.getStatusKz().equals(StatusKz.OLD)) 
      continue; 
     for (TermKondValue tilg : kondition.getTermimKonditions()) { 
      if (tilg.getStatusKz().equals(StatusKz.OLD)) 
       continue; 

      TerminKondListContent listContent = new TerminKondListContent(tilg, kondition.getChangeDatum(), funds); 
      list.add(listContent); 
     } 
    } 

    SimpleListControl listCtrl = new SimpleListControl(); 
    listCtrl.setDataModel(new ListDataModel(list)); 

मैं निम्नलिखित रिफैक्टरिंग java8 धाराओं उपयोग करने की कोशिश? वापस शून्य? मैं फिर

list.stream().filter(Objects::nonNull) 

के माध्यम से स्ट्रीम से शून्य मानों को फ़िल्टर कर सकता है क्या वैकल्पिक विकल्प का उपयोग यहां एक विकल्प है?

उत्तर

2

ऐसा नहीं है कि सुंदर नहीं है, लेकिन आप यह एक Stream<KonditionValue> बनाता है और केवल लोगों स्थिति नहीं है जहां StatusKz.OLD रहता निम्नलिखित

List<ListDataContent> list = 
    konditions.stream() 
       .filter(kondition -> !kondition.getStatusKz().equals(StatusKz.OLD)) 
       .flatMap(kondition -> 
       kondition.getTerminTilgkonditions() 
          .stream() 
          .filter(tilg -> !tilg.getStatusKz().equals(StatusKz.OLD)) 
          .map(tilg -> new AbstractMap.SimpleEntry<>(kondition, tilg)) 
      ) 
       .map(e -> new TerminKondTilgListContent(e.getValue(), e.getKey().getChangeDatum(), funds)) 
       .collect(Collectors.toList()); 

हो सकता है। फिर, यह उनमें से प्रत्येक को उनके TermKondTilgValue एस में फ्लैट मैप्स जहां केवल TermKondTilgValue स्थिति नहीं है StatusKz.OLD भी रखा जाता है।

ध्यान दें कि हम TermKondTilgValue और KonditionValue दोनों का संदर्भ रखते हैं क्योंकि हमें बाद में आवश्यकता होगी, इसलिए हम AbstractMap.SimpleEntry को दो मानों के लिए धारक के रूप में उपयोग करते हैं।

अंत में, इस स्ट्रीम को संबंधित TerminKondTilgListContent पर मैप किया गया है और एक सूची में एकत्र किया गया है।

+1

यह काम करना चाहिए। क्या आपको नहीं लगता कि इसे पढ़ना मुश्किल है? मेरा समाधान थोड़ा और पठनीय दिखता है। हालांकि मैं अभी भी अनिश्चित हूं कि इस मामले में "वापसी शून्य" के साथ क्या करना है। – Chris311

+2

@ Chris311 आपका समाधान वास्तव में आपके पुराने कोड का मिश्रण है। मुझे लगता है कि इसे पढ़ना मुश्किल है, इसलिए आपके लूप को रखना बुरा विचार नहीं होगा। – Tunaki

+0

ठीक है, मैं जावा 8 स्ट्रीम-रीफैक्टरिंग का उपयोग नहीं करूंगा :-) – Chris311

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