Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将映射器流应用于Java8中的另一个流_Java_Functional Programming_Java 8_Java Stream - Fatal编程技术网

将映射器流应用于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

在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> 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:the
orElse
变体是一个小优化,因为它没有将一个标识函数与另一个函数相结合。如果
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);