2015-11-03 45 views
5

在Java8中我有一個流,我想申請一個映射器流在Java8中應用一個映射器流到另一個流中

例如:

Stream<String> strings = Stream.of("hello", "world"); 
Stream<Function<String, String>> mappers = Stream.of(t -> t+"?", t -> t+"!", t -> t+"?"); 

我想寫:

strings.map(mappers); // not working 

但我現在最好的解決我的任務的方法是:

for (Function<String, String> mapper : mappers.collect(Collectors.toList())) 
    strings = strings.map(mapper); 

strings.forEach(System.out::println); 

我怎樣才能解決這個問題

  • 而不收集映射器到列表
  • 不使用for循環
  • 沒有打破我的流暢代碼

回答

8

由於map要求可應用於每個元素的功能,但你的Stream<Function<…>>只能是評估一次,不可避免地將流處理成可重用的東西。如果它不應該是一個Collection,只需將其降低到一個Function

strings.map(mappers.reduce(Function::andThen).orElse(Function.identity())) 

完整的例子:該工作

Stream<Function<String, String>> mappers = Stream.of(t -> t+"?", t -> t+"!", t -> t+"?"); 
Stream.of("hello", "world") 
     .map(mappers.reduce(Function::andThen).orElse(Function.identity())) 
     .forEach(System.out::println); 
+1

其他變化:'mappers.reduce(Function.identity()函數::和Then)','mappers.reduce(Function.identity(),Function :: compose)'。 – rgettman

+3

@rgettman:'orElse'變體是一個小的優化,因爲它不會將一個身份函數與另一個函數結合起來。 – Holger

+0

如果'Function.identity()'覆蓋了'compose'和'andThen',那將會很不錯...或者JIT編譯器無論如何都會擺脫這種複雜性? –

相關問題