2017-02-06 3 views
0

Ich habe so im alten Stil Code:Java Stream: Wie übergebe ich Set zu Stream.of() und rufe Methode für jedes Element auf?

 if (setContainer.getSet() == null) { 
      return null; 
     } 
     for (SetElement setElement : setContainer.getSet()){ 
      if ("SomeString".equals(SetElement.getCode())) { 
       return setElement.getValue(); 
      } 
     } 
     return null; 

ich das versucht habe, aber es funktioniert nicht überprüfen, ob Set null ist:

setContainer.getSet() 
        .stream() 
        .filter(setValue -> "SomeValue".equals(setElement.getCode())) 
        .map(SetElement::getValue) 
        .findAny() 
        .orElse(null) ; 

wie ich verstehen, ich Stream.of() verwenden sollte, aber i dont verstehen, wie Code auszuführen, wie oben, weil es immer Optional<Set<SetElement>> gibt

+1

Warum sollten Sie 'Stream.of()' verwenden? –

+0

wie ich untersand, wird es iset! = Null überprüfen, oder es wird nicht? – Igor

+1

Ich sehe das nicht in [dem Dokument] (https://docs.oracle.com/javase/8/docs/api/?java/util/stream/Stream.html). –

Antwort

5

Sie Optional.ofNullable dies zu erreichen, verwenden können:

return Optional.ofNullable(setContainer.getSet()) 
    .flatMap(set -> set.stream() 
     .filter(e -> "SomeValue".equals(e.getCode())) 
     .map(SetElement::getValue) 
     .findAny()) 
    .orElse(null); 
+0

Sorry, Sie hatten Recht, Optional.flatMap gibt optional zurück. –

+0

wird dies null zurückgeben, wenn set == null oder setElement == null? – Igor

+0

@Igor ~~ Es wird in beiden Fällen 'null' zurückgeben ~~. Nein warte, ich bin abgelenkt von der Bearbeitung. Es wird 'null' zurückgegeben, wenn die Menge null war oder wenn kein Element gefunden wurde, das den 'Filter' erfüllt. –

2

Sie müssen nicht versuchen, neue Tools anzuwenden, wenn Ihre vorhandenen Tools einwandfrei funktionieren. Wenn Sie also einen Null-Check benötigen, überprüfen Sie es mit if.

set = setContainer.getSet(); 
if(set == null) { 
    return null; 
} else { 
    return mapAndFilter(set); 
} 

Oder mit einem ternären Operator:

Set<T> set = setContainer.getSet(); 
return set == null ? null : mapAndFilter(set); 

Jetzt können Sie mapAndFilter() sauber implementieren, ein Map<T> akzeptieren, die nicht zu null garantiert wird, und ein Map<U> zurück. Es kann durchaus sinnvoll sein, mapAndFilter() mit Streams zu implementieren.

Die Einführung von Optional fügt dem Code unnötige Objekte und unnötige Unordnung hinzu.

Das heißt, es ist besser Stil NULL nie zu vererben, also wenn Sie Ihre setContainer so verbessern können, dass es nie Null zurückgibt (vielleicht kann es eine leere Menge zurückgeben?), Das wäre besser.

Es kann ein guter Kompromiss sein, setContainer Versorgung Optional<Set<T>> zu machen. Aber selbst dann könnten traditionelle Techniken vorzuziehen sein, funktionelle Syntax:

Optional<Set<T>> maybeSet = setContainer.getSet(); 

return maybeSet.isPresent() ? mapAndFilter(maybeSet.get()) : null; 
// vs 
return maybeSet.isPresent() ? mapAndFilter(maybeSet.get()) : Optional.empty(); 
// vs 
return maybeSet.map(mapAndFilterFunction); // might return empty Optional 
// vs 
return maybeSet.map(mapAndFilterFunction).orElse(null); // might return null; 

In diesen mapAndFilter() Verfahren ist. mapAndFilterFunction ist ein Function definiert als Function<Set<T>,Set<U>> mapAndFilterFunction = s -> { ... };

+1

Das ist gut, aber ich würde 'return set == null ändern? set: mapAndFilter (set); 'zur folgenden Version mit einem expliziten * null *:' return set == null? null: mapAndFilter (set); '. Die Tatsache, dass "set" an diesem Punkt "null" ist, ist eine Art Zufall für die Logik dieser Linie; Du willst nicht ein null * set * sondern ein null * item * zurückgeben, also denke ich, dass es klarer ist, explizit 'null' zu schreiben. –

+0

Ich möchte versuchen, neues Werkzeug, auch dies reduzierte Code zweimal – Igor

+1

+1, vor allem für das sagen, dass die Verwendung von Optional auf diese Weise "fügt unnötige Objekte und unnötige Unordnung in den Code." Wenn 'getSet()' ein Set zurückgibt, ist es normalerweise vorzuziehen, dass es eine leere Menge zurückgibt als 'Optional >', wenn keine Werte zurückgegeben werden. –

Verwandte Themen