Я думаю, вам нужно написать метод, тип возвращаемого значения которого зависит от Function
-аргумента:
class InputConverter<T> {
private final T value;
public InputConverter(T value) {
this.value = value;
}
public <R> R convertBy(Function<T, R> function){
return function.apply(value);
}
}
, а затем вы можете комбинировать Function
-аргументы, используя стандартные методы compose
и andThen
:
final String fname = "fname_value"
InputConverter<String> inputConverter = new InputConverter<>(fname);
Function<String, List<String>> valueToListFunction = Arrays::asList;
Function<List<String>, String> firstValueFunction = l -> l.get(0);
List<String> strings = inputConverter.convertBy(valueToListFunction);//[fname_value]
String firstValue = inputConverter.convertBy(
valueToListFunction
.andThen(firstValueFunction)
);
также вы можете использовать другой стандарт FunctionalInterfaces
, например UnaryOperator
:
UnaryOperator<String> firstChangeFunction = arg -> arg.concat(" + first");
UnaryOperator<String> secondChangeFunction = arg -> arg.concat(" + second");
String firstValue = inputConverter.convertBy(
valueToListFunction
.andThen(firstValueFunction)
.andThen(secondChangeFunction)
.compose(firstChangeFunction)
); // sout: fname_value + first + second
или написать самостоятельно.