fn1 = ... Function, Str-6ren">
gpt4 book ai didi

java - 将各种类型的函数应用于值

转载 作者:行者123 更新时间:2023-12-03 18:51:12 25 4
gpt4 key购买 nike

假设我有一个方法 将多个函数应用于值 .
用法示例:

String value = "a string with numb3r5";
Function<String, List<String>> fn1 = ...
Function<List<String>, String> fn2 = ...
Function<String, List<Integer>> fn3 = ...

InputConverter<String> converter = new InputConverter<>(value);
List<Integer> ints = converter.convertBy(fn1, fn2, fn3);
是否可以使用 使其应用多个功能?各种输入和返回值 ?
我试过使用通配符,但这不起作用。
public class InputConverter<T> {
private final T src;

public InputConverter(T src) {
this.src = src;
}

public <R> R convertBy(Function<?, ?>... functions) {
R value = (R) src;

for (Function<?, ?> function : functions)
value = (R) function.apply(value);
^^^^^
return value;
}
}

最佳答案

您可以在 Function 上使用链像下面这样

Function<String, List<Integer>> functionChain = fn1.andThen(fn2).andThen(fn3);
您可以通过使用原始类型来实现几乎相同的事情
@SuppressWarnings({"unchecked", "rawtypes"})
public <R> R convertBy(Function... functions) {
Function functionsChain = Function.identity();

for (Function function : functions) {
functionsChain = functionsChain.andThen(function);
}

return (R) functionsChain.apply(src);
}

否则,我看到的唯一其他模式是使用与 Optional 相同的模式。或 Stream就像评论中建议的那样
List<Integer> fileInputStreams = converter.convertBy(fn1)
.convertBy(fn2)
.convertBy(fn3)
.get();

// with this implementation

public static class InputConverter<T> {
private final T src;

public InputConverter(T src) {
this.src = src;
}

public <R> InputConverter<R> convertBy(Function<T, R> function) {
return new InputConverter<>(function.apply(src));
}

public T get() {
return src;
}
}

关于java - 将各种类型的函数应用于值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66936496/

25 4 0
文章推荐: javascript - 使用 javascript 保持粘性使 div 超出父级
文章推荐: c# - IEnumerable 和 IEnumerable[] 之间的优雅转换