在Java8中将映射器流应用于另一个流

时间:2015-11-03 19:15:48

标签: java functional-programming java-8 java-stream

在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循环
  • 不破坏我的流利代码

1 个答案:

答案 0 :(得分: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);