2016-04-30 7 views
2

Wie kann ich Funktionen verwenden, die void in einem Stream zurückgeben? Vor diesem Beispiel, in dem eine Datei Strings enthält, gelesen wird und die Worte gedruckt:Funktionen verwenden, die in Java 8 Streams zurückgeben

myFancyFile.lines() 
      .map(line -> line.split(" ")) 
      .map(Arrays::asList) 
      .forEach(System.out::println); 

Wenn ich die Worte umgekehrt werden, würde ich Collections.reverse() verwenden, aber ich kann es kaum, dass in den Strom einzufügen. Ich realisiere, dass ich ein Comparator hier mit sorted() verwenden kann, dies ist nur ein Beispiel. Ich denke, der einzige Weg, dies zu tun, ist eine Funktion zu verwenden?

Ich kann wirklich nicht sehen, warum diese Frage ein Duplikat von this sein sollte, es ist ein völlig anderes Thema über das bequeme Umschließen von Verbrauchern zu Funktionen.

+0

Was genau wollen Sie umkehren? Die Antworten unten scheinen die Reihenfolge der Wörter in einer Zeile umzukehren, während die Reihenfolge oder Zeilen beibehalten werden. Daher ist die Umkehrung eine Operation an einem einzelnen Stream-Element, die in Ordnung ist. Da Ströme von Natur aus faul sind, ist das Umkehren des gesamten Stroms in einer Pipeline kaum möglich. –

+2

Ich glaube, es ist ein exaktes Duplikat der verknüpften Frage. Sie fragen, wie Sie eine Methode verwenden, die ein Argument akzeptiert und 'void' anstelle von' Function' zurückgibt, was eine Referenz auf eine Methode sein kann, die ein Argument akzeptiert und ein Objekt zurückgibt. –

+0

Die Tatsache, dass Sie die Verbraucher hier nicht direkt verwenden können, sollte ein Hinweis sein, um Ihren Ansatz überhaupt zu überdenken. – zeroflagL

Antwort

2

Verwenden Sie einen Lambda-Ausdruck anstelle einer Methodenreferenz.

myFancyFile.lines() 
      .map(line -> line.split(" ")) 
      .map(array -> { 
       List<String> list = Arrays.asList(array); 
       Collections.reverse(list); 
       return list; 
      }) 
      .forEach(System.out::println); 
0

Sie können das peek Methode:

myFancyFile.lines() 
      .map(line -> line.split(" ")) 
      .map(Arrays::asList) 
      .peek(Collections::reverse) 
      .forEach(System.out::println); 
+2

Sieht gut aus, obwohl laut den Dokumenten dies nur zum Debuggen verwendet werden soll, frage ich mich, ob dies die beste Vorgehensweise für die Aufnahme von Nebenwirkungen in Streams ist. Aber ich möchte, dass Nebenwirkungen wie bei "peek" offensichtlich sind, anstatt sie in einer Referenz zu verstecken, also scheint dies eine gute, aber nicht-kanonische Lösung zu sein. – AdHominem