2016-04-30 80 views
2

如何使用在流中返回void的函數?鑑於這種例子是讀取包含字符串文件和打印的話:使用在Java 8流中返回void的函數

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

如果我想的話被逆轉,我會用Collections.reverse(),但我幾乎不能插入到流。我知道我可以使用Comparator這裏sorted(),這只是一個例子。我想唯一的方法是使用函數?

我真的不明白爲什麼這個問題應該是this的重複,這是關於方便地將消費者包裝到函數中的完全不同的話題。

+0

你到底要扭轉什麼?下面的答案似乎在保持一行或多行的同時排除了一行內的單詞順序。因此,反轉是對單個流元素的操作,這是可以的。由於流設計是懶惰的,在流水線中幾乎不可能倒轉整個流。 –

+2

我相信這是鏈接問題的完全重複。你問的是如何使用一個只接受一個參數並返回'void'而不是'Function'的方法,該方法可以是一個只接受一個參數並返回一個對象的方法的引用。 –

+0

您不能直接在這裏使用消費者的事實應該足以暗示重新考慮您的方法。 – zeroflagL

回答

2

使用lambda表達式而不是方法引用。

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

可以使用peek方法:

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

看起來不錯,雖然根據文件這應該只用於調試,我不知道這是否是在流中包含副作用的最佳做法。但是我希望副作用像'peek'一樣明顯,而不是隱藏在某些方法引用中,所以這似乎是一個很好但非規範的解決方案。 – AdHominem