java - 使用 List<UnaryOperator<...>> 映射对象

标签 java java-11 functional-interface unary-operator

我有一个 List<UnaryOperator<String>>并且需要通过将字符串传递给运算符列表来映射/转换它。我有以下功能性 Java 11 代码:

UnaryOperator<String> addA = (startString) -> startString + "a";
UnaryOperator<String> addB = (startString) -> startString + "b";
UnaryOperator<String> addc = (startString) -> startString + "c";
List<UnaryOperator<String>> operators = List.of(addA, addB, addc);
String concatenatedString =
    operators
        .stream()
        .reduce(
            "", // identity
            (value, op) -> op.apply(value), // accumulator
            (value1, value2) -> value1.concat(value2) // combiner
        );
System.out.println(concatenatedString); // prints "abc" as expected.

我担心的是字符串连接在 2 个地方表示。在每个 UnaryOperator 中排名第一组合器参数中的 s 和 second。让我想知道是否有更好的方法来做到这一点?

最佳答案

您可以利用 UnaryUperator<T> extends Function<T, T> 的优势并链接 Function::andThen 的多个调用得到一个沉着的UnaryOperator<String>列表中的所有内容:

UnaryOperator<String> mergedUnaryOperators = operators.stream()
            .reduce((l, r) -> (string) -> l.andThen(r).apply(string))
            .orElseGet(UnaryOperator::identity);

String output = mergedUnaryOperators.apply("");      // results in "abc"

为了更清楚地了解它是如何工作的,这在 reduce 中被称为方法:

new BinaryOperator<UnaryOperator<String>>() {
  @Override
  public UnaryOperator<String> apply(UnaryOperator<String> l, UnaryOperator<String> r) {
     return string -> l.andThen(r).apply(string);
  }
}

关于java - 使用 List<UnaryOperator<...>> 映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64078391/

相关文章:

java - <匿名按钮>不是抽象的

java - 使用 javapackager 向安装程序添加许可证

spring-boot - 如何在 Vaadin 14 LTS 中正确处理拒绝访问

java - 让 javaFX 11 应用程序在 docker 上运行

java - 有没有办法打印功能界面?

java 8方法引用,允许不兼容的返回类型

java - 如何配置 Spring Cloud Stream 中函数的绑定(bind),以将其输入绑定(bind)到 Web 端点并将其输出绑定(bind)到 Kafka 主题

java - 测试中在xml资源之前读取spring属性源

java - ForkJoinPool 性能 Java 8 对比 11

java - 如何在项目中打包资源文件