我有一个 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/