2016-07-02 3 views
1

Ich versuche, eine Karte von Namen zu einem Wert zu bauen. Ich habe diesen Stream, der die Methode getValue zweimal aufruft. Einmal, um sicherzustellen, dass der Rückgabewert nicht null ist, und dann erneut, um den Wert tatsächlich zu sammeln. Ich versuche herauszufinden, wie man einen Lambda-Block hinzufügt, um das Rückgabeobjekt zu erfassen.Wie verhindert man, dass der Java-Stream dieselbe Methode zweimal ausführt?

Arrays.stream(enums) 
    .collect(Collectors.toMap(
      en -> en.name(), 
      en -> ((issue.getValue(en) != null) ? issue.getValue(en) : "") 
    )); 

Ich bekomme verschiedene IDE-Syntaxfehler, wenn ich verschiedene Anordnungen ausprobierte. Ich denke, das sollte trivial sein, aber es entzieht sich mir. Jede Hilfe wäre genial ...

Antwort

7

nur einen Block anstelle eines einzigen Ausdruck:

theEnum -> { String v = issue.getValue(theEnum); return v != null ? v : ""; } 
+0

Dank verwenden, dies hat den Trick perfekt und war Was ich zuerst machen wollte. Beachte: dass die Antwort von Yassin Hajaj auch funktioniert hat, aber ich habe diesem einen Vorteil gegeben. –

7

Sie möchten Optional#ofNullable#orElse

Arrays.stream(enums) 
     .collect(Collectors.toMap(
      en -> en.name(), 
      en -> Optional.ofNullable(issue.getValue(en)).orElse("") 
     )); 
+0

Auch, danke für die Antwort. Dies hat zusätzlich zu weros Antwort funktioniert. Ich ging mit ihnen zu der Tatsache, dass es mehr im Einklang mit dem war, was ich dachte. Ich würde beide als richtige Antworten markieren, wenn ich könnte, aber wenn ich gezwungen bin, Haare zu teilen, wählen Sie ihre aus, weil ich mag, dass es in einem Lambda-Block für Wartungszwecke ist und ich fühle mich, als ob es etwas schneller sein wird. –

+2

@JustinA Hey Justin, solange du hast, was du willst, ist es in Ordnung, das eine oder das andere zu akzeptieren :). –

Verwandte Themen