在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
循环答案 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);