将映射器流应用于Java8中的另一个流
在Java8中,我有一个流,我想应用一个映射器流 例如:将映射器流应用于Java8中的另一个流,java,functional-programming,java-8,java-stream,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+"?"); 但我目前解决任务的最佳方法是: for (Function<String, String&g
Stream<String> strings = Stream.of("hello", "world");
Stream<Function<String, String>> mappers = Stream.of(t -> t+"?", t -> t+"!", t -> t+"?");
但我目前解决任务的最佳方法是:
for (Function<String, String> mapper : mappers.collect(Collectors.toList()))
strings = strings.map(mapper);
strings.forEach(System.out::println);
for(函数映射器:mappers.collect(Collectors.toList()))
strings=strings.map(映射器);
strings.forEach(System.out::println);
我怎样才能解决这个问题
- 没有将地图绘制者收集到列表中
- 不使用
循环for
- 不破坏我流畅的代码
map
需要一个可以应用于每个元素的函数,但是您的流只能被评估一次,因此不可避免地要将流处理为可重用的内容。如果它不应该是一个集合
,只需将其简化为一个函数
:
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);
streammappers=Stream.of(t->t+“?”,t->t+“!”,t->t+“?”;
“你好”,“世界”)
.map(mappers.reduce(Function::and then).orElse(Function.identity())
.forEach(System.out::println);
其他有效的变体:mappers.reduce(Function.identity(),Function::然后)
,mappers.reduce(Function.identity(),Function::compose)
@rgetman:theorElse
变体是一个小优化,因为它没有将一个标识函数与另一个函数相结合。如果Function.identity,那就好了()
重写compose
和然后
…或者JIT编译器无论如何都可以摆脱这种复杂性?@Didier L:这样的重写会很好,但是它不能再实现为简单的lambda表达式t->t
。当涉及到CPU复杂性时,如果函数成为一个热点。然后,只剩下一小部分额外的内存分配(除非转义分析可以证明它是纯本地的)。这就是为什么我说,这是一个小优化。
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);